加入带引号的、逗号分隔的字符串(给定包含这些字符串的结构列表)

Nic*_*all 3 json go go-templates

使用 go 模板,我一直在尝试呈现带引号的逗号分隔字符串列表

例如 "string1", "string2", "string3"

我想要呈现的字符串来自一个结构体。请参阅Tags此示例中的:

package main

import (
    "fmt"
    "log"
    "os"
    "strings"
    "text/template"
)

const (
    templateString = `{{range .Tags}}"{{.Name}}", {{end}}`
)

var (
    funcs = template.FuncMap{
        "join":  strings.Join,
        "quote": func(in string) string { return fmt.Sprintf("\"%s\"", in) },
    }
    renderData = Task{
        Name:        "something to do",
        Description: "Do that thing",
        Tags: &[]Tag{
            Tag{Name: "tag1"},
            Tag{Name: "tag2"},
        },
    }
)

func main() {
    tmpl, err := template.New("master").Funcs(funcs).Parse(templateString)
    if err != nil {
        log.Fatal(err)
    }

    if err := tmpl.Execute(os.Stdout, renderData); err != nil {
        log.Fatal(err)
    }

}

type Task struct {
    Name        string
    Description string
    Tags        *[]Tag
}

type Tag struct {
    Name string
}
Run Code Online (Sandbox Code Playgroud)

在操场上看到它

鉴于以下约束,如何做到这一点?:

  • 我不应该添加任何太具体的模板函数(例如,将.Names加入并引用s 的模板函数Tag)(因为我的用户只能编辑模板,而不是 Go-code/template-functions,我应该尝试解决问题相同的工具,这意味着模板和可能非常通用的功能)

Cer*_*món 5

{{if}}仅在需要时使用 an打印逗号。将引号直接添加到模板中:

templateString = `{{range $i, $v := .Tags}}{{if $i}} ,{{end}}"{{.Name}}"{{end}}`
Run Code Online (Sandbox Code Playgroud)

游乐场示例

如果要"在名称中转义,则使用内置的 printf 函数来引用字符串:

templateString = `{{range $i, $v := .Tags}}{{if $i}} ,{{end}}{{printf "%q" .Name}}{{end}}`
Run Code Online (Sandbox Code Playgroud)

游乐场示例