03-Template-Advance
学习完 第二章 之后,你对模板已经有了基本的认识
本章将讨论 Go 的组合特性,以及 建立一个通用的调用 模板的方法
本章的GitHub链接为: Source, Diff, Zip
匿名组合
匿名组合 其实是Go里的一个非常重要的特性,在 Go 的世界里没有继承,只有组合(当然还有接口)。组合其实可以实现部分的继承。
main.go
type Post struct {
User
Body string
}
// IndexViewModel struct
type IndexViewModel struct {
Title string
User
Posts []Post
}就是 将 User User -> User其它都不变,这样执行,发现程序照常运行
不过,现在我们可以改下templates/index.html
templates.index.html
由于 匿名组合 ,我们现在可以将 {{.User.Username}} -> {{.Username}}
就是我们可以直接使用 匿名组合 的属性,以及方法,其实也是变像的实现了继承。
关于 Go 的 面向对象,可以看下 参考
本小节 Diff
模板继承
其实 Go 的模板应该没有 Flask jinja2 这样的功能强大,它只有 include,所以为了实现模板的继承,我们需要发挥下主观能动性
main.go
templates/_base.html
templates/content/index.html
这里用了模板继承,_base 是 基础模板,这样 比如 head 等信息不用再重复的去在每个.html文件中重复定义,我们可以专注于每个页面的业务逻辑和内容。
由于没有像 Jinja2 这样的原生支持模板继承,这个实现的关键就是 PopulateTemplates 函数,它的作用是 遍历 templates/content/ 文件夹下的所有文件,并和 templates/_base.html 合成 template.Template,然后再存入 map 中(在 Python 中一般叫 dict),可以使用例如 index.html 的 key 来访问。
我们现在运行下程序,页面还是和原来一样(只是我们在 _base template 里面加入了 Home 的导航),不过我们的templates文件夹已经有了基础模板,并且具备了快速扩展的能力。下章 Web Form 我们可以看见效果。

本小节 Diff
Links
上一节: 02-Template-Basic
下一节: 04-Web-Form
Last updated