Gin模板渲染

508 阅读3分钟

模板

在这里可以理解为事先定义好的HTML文档文件

模板渲染

使用相应的数据去替换HTML文档中事先准备好的标记。也就是后端拿到数据,将其塞到模板里,最终生成html的文本,返回给浏览器的过程,跟浏览器的内核渲染不是一回事。

Go语言的模板引擎

Go语言内置了文本模板引擎text/template和用于HTML文档的html/template。它们的作用机制可以简单归纳如下:

  1. 模板文件通常定义为.tmpl.tpl为后缀(也可以使用其他的后缀),必须使用UTF8编码。
  2. 模板文件中使用{{}}包裹和标识需要传入的数据。
  3. 传给模板这样的数据就可以通过点号(.)来访问,如果数据是复杂类型的数据,可以通过{{ .FieldName }}来访问它的字段。
  4. {{}}包裹的内容外,其他内容均不做修改原样输出。

Gin框架模板渲染与Go模板引擎的使用一致,可以分为三部分:定义模板文件、解析模板文件和模板渲染。

可以参考文章:Go语言标准库之http/template

不使用默认中间件

使用

r := gin.New()

代替

// Default 使用 Logger 和 Recovery 中间件
r := gin.Default()

多模板渲染

Gin框架中使用LoadHTMLGlob()或者LoadHTMLFiles()方法进行HTML模板渲染

  1. LoadHTMLGlob支持正则表达式
  2. 使用不同目录下相同的模板时,需要用define定义名称,c.HTML(xx,"name",xx)中的name必须与引用的html文件内define定义的一致,且defineend成对出现。
func main() {
	router := gin.Default()
	router.LoadHTMLGlob("templates/**/*")//**代表目录,*代表文件
	router.GET("/posts/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "try/index.tmpl", gin.H{
			"title": "Posts",
		})
	})
	router.Run(":8080")
}

templates/posts/index.tmpl:

{{ define "try/index.tmpl" }}
<html>
<h1>
	{{ .title }}
</h1>
<p>Using posts/index.tmpl</p>
</html>
{{ end }}

移除空格

可以使用{{-去掉去除模板内容左侧的所有空白符号,使用-}}去除模板内容右侧的所有空白符号。

{{- .title -}}

注意: -要紧挨{{}},同时与模板值之间需要使用空格分隔。

pipeline

pipeline是指产生数据的操作。比如{{.}}{{.Name}}等。Go的模板语法中支持使用管道符号|链接多个命令,用法和unix下的管道类似:,|前面一条命令的输出就是后面条命令的输入。

注意: 并不是只有使用了|才是pipeline。Go的模板语法中,pipeline的概念是传递数据,只要能产生数据的,都是pipeline

除此之外,pipeline 中的函数还支持多个参数,2 个 3 个甚至多个参数都是支持的,除了管道前面的输出作为第一个参数之外,在函数后面接着的所有变量都是参数,依次排序。下面就是一个管道的示例:

.Name | toUpper | toEnglish

这里包含了 .Name 是一个变量,用于取值,然后 toUppertoEnglish 都是函数,除了使用 .Name 用于取值之外,还支持 .Method 用于调用函数,那么这里的取值和调用方法的对象主体是谁?这就是在渲染这个模板的时候传进来的对象,所有关于 . 的操作都以这个传递的对象为基准进行操作。

变量

我们还可以在模板中声明变量,用来保存传入模板的数据或其他语句生成的结果。具体语法如下:

$obj := {{.}}

其中$obj是变量的名字,在后续的代码中就可以使用该变量了。

好文推荐:

Go标准库:深入剖析Go template