Go语言中使用block实现模板继承



前言

使用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语法,使用多模板方法与官方给的感觉区别并非很大(并没有阅读源码),要继承很多个时,使用这方法可以少写几行代码。

参考文章:

Gin框架介绍及使用 | 李文周的博客

GitHub - gin-contrib/multitemplate: This is a custom HTML render to support multi templates

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值