加入引号、逗号分隔的字符串(给出包含这些字符串的结构列表)
Joining quoted, comma-separated strings (given a list of structs containing those strings)
使用 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
}
如果有以下限制,如何做到这一点? :
- 我不应该添加任何太具体的模板函数(例如,加入并引用
.Name
s 以引用 Tag
s 的函数)(因为我的用户将只能编辑模板,而不能 Go-code/template-functions,我应该尝试使用相同的工具解决问题,这意味着模板和可能非常通用的函数)
使用 {{if}}
仅在需要时打印逗号。将引号直接添加到模板中:
templateString = `{{range $i, $v := .Tags}}{{if $i}} ,{{end}}"{{.Name}}"{{end}}`
如果要转义名称中的"
,那么使用内置的printf函数引用字符串:
templateString = `{{range $i, $v := .Tags}}{{if $i}} ,{{end}}{{printf "%q" .Name}}{{end}}`
使用 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
}
如果有以下限制,如何做到这一点? :
- 我不应该添加任何太具体的模板函数(例如,加入并引用
.Name
s 以引用Tag
s 的函数)(因为我的用户将只能编辑模板,而不能 Go-code/template-functions,我应该尝试使用相同的工具解决问题,这意味着模板和可能非常通用的函数)
使用 {{if}}
仅在需要时打印逗号。将引号直接添加到模板中:
templateString = `{{range $i, $v := .Tags}}{{if $i}} ,{{end}}"{{.Name}}"{{end}}`
如果要转义名称中的"
,那么使用内置的printf函数引用字符串:
templateString = `{{range $i, $v := .Tags}}{{if $i}} ,{{end}}{{printf "%q" .Name}}{{end}}`