是否有一种简单的方法,如template.ParseFiles("base.html", "home.html")
,但是字符串是否可以从一组字符串构建模板?
我有一个基本模板和一个页面模板列表(全部作为字符串),我想在基本模板之上构建。
我想出了如何合并它们,但我的解决方案非常冗长,即使工作也不够优雅。
答案 0 :(得分:4)
您可以使用template.New()
功能创建一个新的空模板。然后,您可以使用Template.New()
方法创建一个新的空关联模板。您可以使用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.
另请参阅相关问题:Go template name
虽然我们可以多次在单个模板上调用Template.Parse()
方法,并且它会正确解析多个命名的模板,但仍然建议您获取新的template.Template
通过调用Template.New()
为每个人。因为如果模板文本具有命名模板的外部内容,则它们将被覆盖,并且仅保留最后一个。例如:abc {{define "one"}}no 1{{end}}
。随后的"abc"
电话会丢失静态文字Template.Parse()
。
Template.Parse()
的文档中也提到了这一点:
(在使用相同接收器模板的Parse多次调用中,只有一个调用可以包含除空格,注释和模板定义之外的文本。)
答案 1 :(得分:0)
也许
for _, templ := range ListOfPagesTemplates{
YourBaseTemplate.Parse(templ)
}
错误检查缺席以便阅读简单