你应该知道的是,一个值template.Template
可以是多个模板的集合,看它Template.Templates()
返回这个集合的方法。
集合中的每个模板都有一个唯一的名称,可以通过它来引用(参见 参考资料Template.Name()
)。还有一个{{template "name" pipeline}}
动作,使用它你可以在一个模板中包含其他模板,另一个模板是集合的一部分。
请参阅此示例。让我们定义2个模板:
const tmain = `<html><body>
Some body. Now include the other template:
{{template "content" .}}
</body></html>
`
const tcontent = `I'M THE CONTENT, param passed is: {{.Param}}`
如您所见,tmain
包含另一个名为"content"
. 您可以使用Template.New()
方法(强调:method,不要与 func 混淆template.New()
)创建一个新的关联命名模板,该模板将成为您正在调用其方法的模板的一部分。结果,它们可以相互引用,例如它们可以相互包含。
让我们看看将这 2 个模板解析为一个的代码,template.Template
以便它们可以相互引用(为简洁起见,省略了错误检查):
t := template.Must(template.New("main").Parse(tmain))
t.New("content").Parse(tcontent)
param := struct{ Param string }{"paramvalue"}
if err := t.ExecuteTemplate(os.Stdout, "main", param); err != nil {
fmt.Println(err)
}
输出(在Go Playground上试试):
<html><body>
Some body. Now include the other template:
I'M THE CONTENT, param passed is: paramvalue
</body></html>
选择
另请注意,如果您有许多更大的模板,则它的可读性和可维护性会降低。您应该考虑将模板保存为文件,并且您可以使用template.ParseFiles()
and template.ParseGlob()
,它们都可以一次解析多个文件并从中构建模板集合,因此它们可以相互引用。模板的名称将是文件的名称。