在Go中解析多个模板

问题描述 投票:2回答:2

我试图弄清楚如何在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需要成为上述变量的一部分吗?

go go-templates
2个回答
1
投票

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)
}

https://play.golang.org/p/q9ox01W8U00


1
投票

一个选择是使用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()的优点是你可以拥有多个具有相同名称的模板,这在一次加载所有模板时都不起作用。

一次加载的优点是它更简单。

© www.soinside.com 2019 - 2024. All rights reserved.