一架梯子,一头程序猿,仰望星空!

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对象,而不是模版参数。

例子:

//定义用户类型
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中通过自定义变量,引用模版参数。