前言
使用block块实现在go语言中的HTML页面的模板继承和模板渲染,本文使用的是在gin框架下推荐的多模板渲染。下面将介绍两种渲染模式,一种是官方自带的方法,另一种是在gin框架下的多模板的渲染。
一、官方自带方法
Go 1.6版以后,才有得新的语法 block,这个语法的使用类似于template语法的使用,但是不同的是block会有一个默认值,而template没有默认值。类似Python的模板语法,但是有所不同。
还是看别人写的吧,不想码字,这里给出文章链接:文章链接点击
模板使用 .html 后缀格式也是可以渲染的,不用担心。
二、gin框架的多模板渲染
1.引入库
首先下载安装使用多模板代码
go get github.com/gin-contrib/multitemplate
2.引入她到你的代码里面
添加她
import "github.com/gin-contrib/multitemplate"
3.高级示例
package main
import (
"path/filepath"
"github.com/gin-contrib/multitemplate"
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
//加载静态文件
r.Static("images", "./static/images")
r.Static("css", "./static/css")
r.Static("js", "./static/js")
//加载模板
r.HTMLRender = loadTemplates("./templates")
r.GET("/index", func(c *gin.Context) {
//渲染模板
c.HTML(http.StatusOK, "index_test.html", gin.H{
"message": "Hello world!",
})
})
r.GET("/about", func(c *gin.Context) {
c.HTML(http.StatusOK, "list_t.html", gin.H{
"message": "测试成功?",
})
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
r.Run()
}
// 模板载入函数
func loadTemplates(templatesDir string) multitemplate.Renderer {
r := multitemplate.NewRenderer()
/* 自定义模板函数
funcMap := template.FuncMap{
"cutDate": cutDate, // 模板函数
}*/
bases, err := filepath.Glob(templatesDir + "/base/*.html")
if err != nil {
panic(err.Error())
}
includes, err := filepath.Glob(templatesDir + "/includes/*.html")
if err != nil {
panic(err.Error())
}
// 为base/和includes/目录生成 templates map
for _, include := range includes {
baseCopy := make([]string, len(bases))
copy(baseCopy, bases)
files := append(baseCopy, include)
// 加模板函数的加载方法 r.AddFromFilesFuncs(filepath.Base(include), funcMap, files...)
r.AddFromFiles(filepath.Base(include), files...)
}
return r
}
/* func cutDate(t time.Time) string {
year, month, day := t.Date()
return fmt.Sprintf("%d-%02d-%02d", year, month, day)
} */
文件位置如上图,模板和要继承的html放在不同的文件夹下,修改代码对应的文件夹名称,即可实现渲染多个模板。
代码太多以图示例,主模板里面要填充的内容如下图所示。
继承页面如下图所示
每个继承的模板开头需加 {{template "base.html"}} ,表示被继承的是那个模板,list_t.html文件与index_test.html文件类似,不在贴出来了。在想要添加内容的任何地方,使用block块即可,使用不继承也不会报错有默认值,与jinja2有些许类似。继承的与被继承的需要放在不同的文件夹下。静态文件需放在静态文件加载文件夹下。
需要使用模板函数,查看注释。
此时就可以渲染多个页面,继承来自同一个模板了。
总结
1.6版本以后才有block语法,使用多模板方法与官方给的感觉区别并非很大(并没有阅读源码),要继承很多个时,使用这方法可以少写几行代码。
参考文章:
GitHub - gin-contrib/multitemplate: This is a custom HTML render to support multi templates