模版流程控制域名主要指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对象,而不是模版参数。
例子:
//定义用户类型
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中通过自定义变量,引用模版参数。