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模板引擎 模版函数

Go模板引擎为我们提供了函数机制,方面我们在处理模板时执行一些特定的功能,例如格式化输出内容、字母大小写转换等等。函数调用语法格式:functionName [Argument...]。内置模板函数:Go模板引擎预先定义了一些函数,我们可以直接在模板中进行函数调用,下面介绍常用的内置函数。