如何使用 Go 将多个字符串解析为一个模板?
How to parse multiple strings into a template with Go?
有没有类似 template.ParseFiles("base.html", "home.html")
的简单方法,但字符串可以从一组字符串构建模板?
我有一个基本模板和一个页面模板列表(全部为字符串),我想在基本模板之上构建它们。
我想出了如何合并它们,但我的解决方案非常冗长而且看起来不够优雅,即使有效。
您可以使用 template.New()
function. Then you may use the Template.New()
method to create a new, empty, associated template. And you may parse "into" this using the Template.Parse()
方法创建一个新的空模板。
它可能是这样的:
func parseTemplates(templs ...string) (t *template.Template, err error) {
t = template.New("_all")
for i, templ := range templs {
if _, err = t.New(fmt.Sprint("_", i)).Parse(templ); err != nil {
return
}
}
return
}
正在测试:
t, err := parseTemplates(
`{{define "one"}}I'm #1.{{end}}`,
`{{define "two"}}I'm #2, including #1: {{template "one" .}}{{end}}`,
)
if err != nil {
panic(err)
}
if err = t.ExecuteTemplate(os.Stdout, "two", nil); err != nil {
panic(err)
}
输出(在 Go Playground 上尝试):
I'm #2, including #1: I'm #1.
另见相关问题:
备注
虽然我们可以通过调用 Template.New()
为每个调用 Template.Parse()
method on a single template multiple times, and it would parse multiple named templates properly, it is still advisable to acquire a new template.Template
。因为如果模板文本有命名模板外部的内容,它们将被覆盖,只保留最后一个。例如:abc {{define "one"}}no 1{{end}}
。静态文本 "abc"
将在随后的 Template.Parse()
调用中丢失。
这在Template.Parse()
的文档中也有注明:
(In multiple calls to Parse with the same receiver template, only one call can contain text other than space, comments, and template definitions.)
可能
for _, templ := range ListOfPagesTemplates{
YourBaseTemplate.Parse(templ)
}
为了便于阅读,缺少错误检查
有没有类似 template.ParseFiles("base.html", "home.html")
的简单方法,但字符串可以从一组字符串构建模板?
我有一个基本模板和一个页面模板列表(全部为字符串),我想在基本模板之上构建它们。
我想出了如何合并它们,但我的解决方案非常冗长而且看起来不够优雅,即使有效。
您可以使用 template.New()
function. Then you may use the Template.New()
method to create a new, empty, associated template. And you may parse "into" this using the Template.Parse()
方法创建一个新的空模板。
它可能是这样的:
func parseTemplates(templs ...string) (t *template.Template, err error) {
t = template.New("_all")
for i, templ := range templs {
if _, err = t.New(fmt.Sprint("_", i)).Parse(templ); err != nil {
return
}
}
return
}
正在测试:
t, err := parseTemplates(
`{{define "one"}}I'm #1.{{end}}`,
`{{define "two"}}I'm #2, including #1: {{template "one" .}}{{end}}`,
)
if err != nil {
panic(err)
}
if err = t.ExecuteTemplate(os.Stdout, "two", nil); err != nil {
panic(err)
}
输出(在 Go Playground 上尝试):
I'm #2, including #1: I'm #1.
另见相关问题:
备注
虽然我们可以通过调用 Template.New()
为每个调用 Template.Parse()
method on a single template multiple times, and it would parse multiple named templates properly, it is still advisable to acquire a new template.Template
。因为如果模板文本有命名模板外部的内容,它们将被覆盖,只保留最后一个。例如:abc {{define "one"}}no 1{{end}}
。静态文本 "abc"
将在随后的 Template.Parse()
调用中丢失。
这在Template.Parse()
的文档中也有注明:
(In multiple calls to Parse with the same receiver template, only one call can contain text other than space, comments, and template definitions.)
可能
for _, templ := range ListOfPagesTemplates{
YourBaseTemplate.Parse(templ)
}
为了便于阅读,缺少错误检查