我试图弄清楚如何在Go中加载多个模板,当很多人有类似的....基础,你可以说?
目前,我正在我正在处理的示例应用程序中加载以下两个模板:
homeTemplate, err = template.ParseFiles(
"views/layout/base.gohtml",
"views/layout/menu.html",
"views/layout/footer.gohtml",
"views/home.gohtml")
if err != nil {
panic(err)
}
contactTemplate, err = template.ParseFiles(
"views/layout/base.gohtml",
"views/layout/menu.html",
"views/layout/footer.gohtml",
"views/contact.gohtml")
if err != nil {
panic(err)
}
我的问题如下:
有没有办法以这样的方式设置它,我可以在变量中存储每个模板列表中的前三个条目,然后在最后添加最后一个包含,这样我可以缩短代码量并简化操作?
我解决了这整件事吗?我在某处读到了使用包含template["name"]
语法的设置,然后从中进行渲染,也许我只需要在其余部分之前加载基本模板,因为它们对布局的东西更少,而且它们可能不会t需要成为上述变量的一部分吗?
https://golang.org/pkg/html/template/#Template.Clone
通过在克隆生成后添加变体,克隆可用于准备通用模板并将其与其他模板的变体定义一起使用。
baseTemplate, err = template.ParseFiles(
"views/layout/base.gohtml",
"views/layout/menu.html",
"views/layout/footer.gohtml")
if err != nil {
panic(err)
}
homeTemplate, err = template.Must(baseTemplate.Clone()).ParseFiles("views/home.gohtml")
if err != nil {
panic(err)
}
contactTemplate, err = template.Must(baseTemplate.Clone()).ParseFiles("views/contact.gohtml")
if err != nil {
panic(err)
}
一个选择是使用Template.Clone()
,你可以在mkopriva的答案中看到。请注意,Template.Clone()
不会复制模板的实际表示,克隆将与原始表示共享表示。
另一个选择是一步解析所有模板文件,因此“基础”模板显然只会被解析一次:
all := template.Must(template.ParseFiles(
"views/layout/base.gohtml",
"views/layout/menu.html",
"views/layout/footer.gohtml",
"views/home.gohtml",
"views/contact.gohtml",
))
你可以使用Template.ExecuteTemplate()
来执行一个指定的命名模板,例如:
// To execute the home template:
err := all.ExecuteTemplate(w, "home.gohtml", params)
// To execute the contact template:
err := all.ExecuteTemplate(w, "contact.gohtml", params)
使用Template.Clone()
的优点是你可以拥有多个具有相同名称的模板,这在一次加载所有模板时都不起作用。
一次加载的优点是它更简单。