在实际项目中,我们不可能只有一个模板,一般来说都有很多个模板,而且这些模板也会共享一些公共的模板,这些公共的模板我们都可以定义成子模板,在需要的时候调用子模板,就可以将子模板的内容嵌入当前模板中。
提示:在项目中使用子模板,可以让项目模板具有模块化的能力,提高模块复用能力和可维护性。
1.定义子模板
定义子模板语法:
{{define "子模板名字"}}
模板内容
{{end}}
例子:
{{define "T1"}}
模板内容T1
{{end}}
{{define "T2"}}
模板内容T2
{{end}}
2.调用子模板
调用子模板语法:
{{template "子模板名字" 参数}}
template函数的第一个参数是模板名字,第二个参数是模板参数, 在子模板内部也是通过点( . ),引用模板参数。
提示: template的第二个模板参数是可选的。
例子:
//模板代码
//这里定义了T1 T2 T3三个模板,T3调用了T1和T2的模板内容,最后我们调用T3模板内容
const templateText = `{{define "T1"}}ONE{{end}}
{{define "T2"}}TWO{{end}}
{{define "T3"}}{{template "T1"}} {{template "T2"}}{{end}}
{{template "T3"}}`
// 创建一个template对象,模板名字为test,然后调用Parse加载templateText模板代码。
tmpl, err := template.New("test").Parse(templateText)
if err != nil {
log.Fatalf("解析模板失败: %s", err)
}
// 渲染模板
err = tmpl.Execute(os.Stdout, "")
if err != nil {
log.Fatalf("渲染模板失败: %s", err)
}
输出:
ONE TWO
3.模板管理
上面的例子,我们将模板代码定义在一个变量或者常量中,这个只是用于演示,实际项目中模板代码通常非常多,建议大家按如下方式组织模板代码:
- 一个模块的模板代码,保存在一个模板文件中,模板文件名为tpl。
- 所有的模板代码都定义在子模板中,方便根据模板名字进行渲染。
例子:
模板目录views, 下面分别按功能模块创建不同的模板文件
创建公共模板文件: views/common.tpl 主要用于保存一些公共的模板定义
{{define "common1"}}
这里是共享模块1
{{end}}
{{define "common2"}}
这里是共享模块2
{{end}}
创建mod1模块的模板文件: views/mod1.tpl
{{define "mod1"}}
这里是模块1
{{- template "common1"}}
{{end}}
创建mod2模块的模板文件: views/mod2.tpl
{{define "mod2"}}
这里是模块2
{{- template "common2"}}
{{end}}
渲染模板代码:
//创建template对象,并且加载views目录下面所有的tpl模板文件。
t := template.Must(template.ParseGlob("views/*.tpl"))
// 渲染mod1子模板
t.ExecuteTemplate(os.Stdout, "mod1", nil)
// 渲染mod2子模板
t.ExecuteTemplate(os.Stdout, "mod2", nil)
输出:
这里是模块1
这里是共享模块1
这里是模块2
这里是共享模块2