有没有一种简单的方法,例如,template.ParseFiles("base.html", "home.html")但是要使用字符串从一组字符串构建模板?
template.ParseFiles("base.html", "home.html")
我有一个基本模板和一个要在基本模板之上构建的页面模板列表(全部作为字符串)。
我想出了如何合并它们的方法,但是我的解决方案很冗长,即使可以使用,看起来也不是很优雅。
您可以使用 function 创建一个新的空模板。然后,您可以使用该 方法 创建一个新的,空的, 关联的 模板。您可以使用方法将其解析为“ into” 。template.New() __Template.New() ____Template.Parse()
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.Template
abc {{define "one"}}no 1{{end}}
"abc"
的文档中也对此进行了说明Template.Parse():
(在使用同一接收者模板的多次Parse调用中,只有一个调用可以包含空格,注释和模板定义以外的其他文本。)