Go模板引擎 流程控制语句
Go模板引擎的流程控制语句主要是 if/range/with 三种语句。
1. if 语句
语法格式1:表达式为真,则执输出 T1
{{if 表达式}} T1 {{end}}
语法格式2:表达式为真,则执输出 T1, 否则输出 T0
{{if 表达式}} T1 {{else}} T0 {{end}}
语法格式3:表达式1为真,则执输出 T1, 否则如果表达式2为真,则输出 T0
{{if 表达式1}} T1 {{else if 表达式2}} T0 {{end}}
2. range 循环语句
语法格式1:
{{range 数组引用}} {{.}} /* 在 range 循环中,(点 .) 引用的是数组元素,而不是模版参数。*/ {{end}}
例子:
// 假设传入的模版参数如下, 这里我们直接传入一个数组: titles := []string{"标题1", "标题2", "标题3"}
模版代码:
{{range .}} {{.}} {{end}}
运行输出结果:
标题1 标题2 标题3
提示:在 range 循环中,改变了 点(.) 的作用,点(.) 引用的是当前的数组元素。
语法格式2:
类似 go 语法循环语句中的 range, 这里定义了两个局部变量 $index 和 $element, 第一个变量代表索引(对于 map 类型数据就是代表 map 的 key), 第二个变量代表元素值(对于 map 类型数据,代表 key 对应的值)。
{{range $index, $element := 数组或者map的引用}} 索引: {{$index}} 元素值: {{$element}} {{end}}
例子1:
map类型模版参数:
// 假设传入的模版参数定义如下 dataMap := map[string]string{} dataMap["key1"] = "value1" dataMap["key2"] = "value2"
模版代码:
{{range $key, $value := .}} key: {{$key}} value: {{$value}} {{end}}
运行输出结果:
key: key1 value: value1 key: key2 value: value2
例子2:
// 假设传入的模版参数如下, 这里传入一个 struct 类型: type Data struct { Titles []string } //初始化模版参数 data := Data{Titles:[]string{"标题1", "标题2", "标题3"}}
模版代码:
{{range $index, $value := .Titles}} {{$index}} - {{$value}} {{end}}
运行输出结果:
0 - 标题1 1 - 标题2 2 - 标题3
3. with 语句
with 语句主要用于 struct 类型数据的访问,就是一种快速访问 struct 数据的方式。
语法:
{{with struct类型对象}} {{.字段}} {{end}}
在 with 语句中,点 (.) 代表的是对 with 引用的 struct 对象,而不是模版参数。
with 语句范例:
// 定义用户类型 type User struct { Id int UserName string } // 模版参数类型 type Data struct { User User } // 定义 user user := User{Id:1001, UserName:"李大成"} //初始化模版参数, 假设我们传入的模版参数是data data := Data{} data.User = user
模版代码:
{{with .User}} Id: {{.Id}} Username: {{.UserName}} {{end}}
运行输出结果:
Id: 1001 Username: 李大成
注意: range 和 with 语句都改变了点(.)引用的数据,那么如果想要在 range 和 with 语句中引用模版参数,请先将点(.)赋值给一个自定义变量, 然后在 range 和 with 中通过自定义变量,引用模版参数。
Go模板引擎为我们提供了函数机制,方面我们在处理模板时执行一些特定的功能,例如格式化输出内容、字母大小写转换等等。函数调用语法格式:functionName [Argument...]。内置模板函数:Go模板引擎预先定义了一些函数,我们可以直接在模板中进行函数调用,下面介绍常用的内置函数。