是否有一种简单的方法,例如,template.ParseFiles("base.html", "home.html")
但是要使用字符串从一组字符串构建模板?
我有一个基本模板和一个要在基本模板之上构建的页面模板列表(全部作为字符串)。
我想出了如何合并它们的方法,但是我的解决方案很冗长,即使可以使用,看起来也不够优雅。
您可以使用function创建一个新的空模板。然后,您可以使用该方法创建一个新的,空的,关联的模板。您可以使用方法将其解析为“ into” 。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.
另请参阅相关问题:转到模板名称
尽管我们可以Template.Parse()
在单个模板上多次调用该方法,并且可以正确解析多个命名模板,但仍然建议template.Template
通过调用为每个模板获取一个新的模板Template.New()
。因为如果模板文本的内容超出了命名模板的范围,则它们将被覆盖,并且仅保留最后一个。例如:abc {{define "one"}}no 1{{end}}
。"abc"
后续Template.Parse()
调用将丢失静态文本。
的文档中也对此进行了说明Template.Parse()
:
(在使用同一接收者模板的多个Parse调用中,只有一个调用可以包含空格,注释和模板定义以外的其他文本。)