我们可以通过定义模板名称{{define "home"}},然后通过将其加载到其他(父)模板中{{template "home"}}。
{{define "home"}}
{{template "home"}}
如何通过变量value加载模板{{template .TemplateName}}。还是不可能?
{{template .TemplateName}}
不幸的是你不能。
该{{template}}动作的语法:
{{template}}
{{template "name"}} The template with the specified name is executed with nil data. {{template "name" pipeline}} The template with the specified name is executed with dot set to the value of the pipeline.
要包含的模板的名称是一个 常量 字符串,它不是 管道 ,在执行过程中可能会根据参数而有所不同。
如果允许的语法为:
{{template pipeline}}
那么您可以使用类似的命令,{{template .TemplName}}但是由于语法仅允许使用常量字符串,因此您不能这样做。
{{template .TemplName}}
从Rob推论为什么不允许动态模板调用(来源):
我们希望模板语言可以进行静态分析,以便模板调用的上下文清晰,可检查且可锁定。如果调用点是完全动态的,则无法完成。类似地,如果一个模板可以属于多个集合,则其上下文可以在集合之间有所不同,从而需要同时分析所有集合。由于您可以根据需要轻松地解决这两个约束,而这是以丢失更高级别包中的静态检查为代价的,因此控制基本模板实现中的情况似乎是明智的。如果约束清楚,则较高级别的程序包(例如,假设的仅HTML的包装程序)可以更轻松地保证没有变通办法。
您可以做的是先执行要包含的模板,然后将结果插入要包含的模板中。您可以使用特殊类型,例如html.HTML在HTML模板的情况下,在插入时不要逃脱内部模板的结果。
html.HTML
请参阅以下示例:
func main() { t := template.Must(template.New("t").Parse(t)) template.Must(t.New("t1").Parse(t1)) params := struct { Name string Value interface{} }{"t1", nil} b := bytes.Buffer{} t.ExecuteTemplate(&b, params.Name, nil) params.Value = template.HTML(b.String()) t.Execute(os.Stdout, params) } const t = `<html><body> Now I will include template with name: {{.Name}} {{.Value}} </body>/html>` const t1 = `I'm template <b>t1</b>.`
输出:
<html><body> Now I will include template with name: t1 I'm template <b>t1</b>. </body>/html>
在Go Playground上尝试一下。
模板的结果t1未转义插入。如果您忽略template.HTML:
t1
template.HTML
params.Value = b.String()
t1 将插入转义,像这样:
<html><body> Now I will include template with name: t1 I'm template <b>t1</b>. </body>/html>
您可以重组模板,使其不希望包含不同名称的模板。
示例:您可能想在其中具有如下page模板的页面中创建页面:
page
<html><body> Title, headers etc. {{template .Page}} Footers </body></html>
您可以将其重组为以下形式:
header 模板:
header
<html><body> Title, headers, etc.
footer 模板:
footer
Footers </body></html
而你的页面模板将包括header与footer这样的:
{{template "header" .}} Page content comes here. {{template "footer" .}}
{{if}}
如果您事先知道模板名称并且它不是详尽的列表,则可以使用{{if}}模板操作包括所需的模板。例:
{{if eq .Name "page1"}} {{template "page1" .}} {{else if eq .Name "page2"}} {{template "page2" .}} ... {{end}}
这里的想法是,您可以手动修改外部模板的静态文本,并插入要包括的内部模板的名称。
这种方法的缺点是,在插入内部模板的名称之后,您必须重新解析该模板,因此,我不建议这样做。