Golang模板
模板就是在写动态页面时不变的部分,服务端程序渲染可变部分生成动态网页,Go 语言提供了 html/template 包来支持模板渲染。
1. 基本语法
模板的基本语法来自于 text/template 包,与大多数语言一样,用 {{
和 }}
来做标识,{{ }}
里可以是表达式,也可以是变量
1.1 变量
模板中的变量通过{{.}} 来访问。Golang渲染template的时候,可以在模板文件中读取变量内的值并渲染到模板里。有两个常用的传入类型。一是struct,在模板内可以读取该struct的内容。二是map[string]interface{},在模板内可以使用key来进行渲染。
以结构体为例,假设初始化了一个结构体 User
|
|
模板获取数据的方式如下
|
|
那么渲染后的模板内容如下
|
|
也可以在模板中定义变量,初始化后就可以进行调用,如下所示
|
|
1.2 逻辑判断
Golang 模板支持 if 条件判断,当前支持最简单的 bool 类型和 string 类型,定义方式如下
|
|
当.condition是bool类型时,值为true表示执行。当.condition是string类型时,值非空表示执行。加入 else 时,形式如下
|
|
此模板也支持if…else if嵌套,定义方式如下所示
|
|
Golang的模板提供了一些内置的模板函数来执行逻辑判断,下面列举目前常用的一些内置模板函数
函数语法 | 函数作用 |
---|---|
{{if not .condition}} {{end}} | not 非 |
{{if and .condition1 .condition2}} {{end}} | and 与 |
{{if or .condition1 .condition2}} {{end}} | or 或 |
{{if eq .var1 .var2}} {{end}} | eq 等于 |
{{if ne .var1 .var2}} {{end}} | ne 不等于 |
{{if lt .var1 .var2}} {{end}} | lt 小于 |
{{if le .var1 .var2}} {{end}} | le 小于等于 |
{{if gt .var1 .var2}} {{end}} | gt 大于 |
{{if ge .var1 .var2}} {{end}} | ge 大于等于 |
假设在 Go 程序中定义了一个map,如下
|
|
在模板文件中进行逻辑判断如下
|
|
逻辑判断也可以使用 with 作为关键词
|
|
或者
|
|
1.3 循环遍历
Golang 的模板支持 range 循环来遍历 map、slice中的内容,语法如下
|
|
在这个range循环内,遍历数据通过$index
和 $value
来实现。还有一种遍历方式,语法格式如下所示
|
|
这种方式无法访问到$index
和$key
的值,需要通过{{.}}来访问对应的$value。这种情况下,在循环体内,外部变量需要使用{{$.}}来访问。
模板文件的示例代码如下
|
|
循环也有 else 语句,如果作为循环条件的数组、切片、映射或通道长度为0,就执行 else 后的语句。
|
|
1.4 模板嵌套
在编写模板的时候,经常需要将公用的模板进行整合,比如每一个页面都有导航栏和页脚,通常的做法是将其编写为一个单独的模块,让所有的页面进行导入,这样就不用重复编写了。
任何网页都有一个主模板,然后可以在主模板内嵌入子模板来实现模块共享。当模板想要引入子模板时,通常使用如下语句
|
|
这样就会载入名为 navbar 的子模版,同时,我们需要定义 navbar 子模版的实现
|
|
在定义中间的内容最终会替代源文件中的 {{template “navbar”}} 这一条语句
如果想要子模板获得父模板的变量,使用如下方法
|
|
2. 模板函数
上面的语法一般情况都是定义在前端文件中的,要对模板进行处理,html/template 还提供了一系列函数。
一个简单的例子如下
|
|
涉及到的几个函数分别是 New,Parse 和 ExecuteTemplate,解释如下
|
|
所以 New 和 Parse 创建一个模板并将字符串解析到该模板,但实际使用时模板文件通常是单独的,这时一般使用 Must 和 ParseFiles 函数。
ParseFiles方法解析filenames指定的文件里的模板定义并将解析结果与t关联。如果发生错误,会停止解析并返回nil,否则返回(t, nil)。至少要提供一个文件。
|
|
可以看到 ParseFiles 返回 (*Template, error),Must 函数正好用来封装这种返回形式的函数
|
|
它会在 err 非 nil 时 panic,一般用于变量初始化
|
|
另外,ExecuteTemplate 将输出指定到名为 name 的模板上,但还有一种简单形式如下
|
|
Execute方法将解析好的模板应用到data上,并将输出写入wr,唯一的区别就是没有绑定模板。