模板引擎为我们提供了函数机制,方面我们在处理模板时执行一些特定的功能,例如格式化输出内容、字母大小写转换等等。
1.函数调用语法
语法格式:
functionName [Argument...]
Argument参数是可选的,如果有多个参数,参数直接用空格分隔。
例子:
{{html "<h1>www.tizi365.com</h1>"}}
输出:
<h1>www.tizi365.com</h1>
html函数的作用是对输入参数进行html转义处理,html标签都转义了。
多个函数参数的例子:
{{printf "%d - %s" 100 "www.tizi365.com"}}
printf函数主要用于格式化输出字符串,是fmt.Sprintf函数的别名,用法跟fmt.Sprintf函数一样,区别就是模板函数的参数用空格隔开, 这里为printf输入了3个参数。
下面是输出:
100 - www.tizi365.com
2.内置模板函数
模板引擎预先定义了一些函数,我们可以直接在模板中进行函数调用,下面介绍常用的内置函数。
2.1. 关系运算和逻辑运算函数
在模板引擎中关系运算(==、<、<=、>、>=、!=)和逻辑运算(and、or、not)都封装成函数形式,也就是说我们需要通过函数调用的方式进行关系运算和逻辑运算。
下面是关系运算函数:
说明:下表中的arg1和arg2代表两个参数
函数名 | 函数调用格式 | 对应关系运算 | 说明 |
---|---|---|---|
eq | eq arg1 arg2 | arg1 == arg2 | arg1等于arg2则返回true |
ne | ne arg1 arg2 | arg1 != arg2 | arg1不等于arg2则返回true |
lt | lt arg1 arg2 | arg1 < arg2 | arg1小于arg2则返回true |
le | le arg1 arg2 | arg1 <= arg2 | arg1小于等于arg2则返回true |
gt | gt arg1 arg2 | arg1 > arg2 | arg1大于arg2则返回true |
ge | ge arg1 arg2 | arg1 >= arg2 | arg1大于等于arg2则返回true |
下面是逻辑运算函数:
函数名 | 函数调用格式 | 对应逻辑运算 | 说明 |
---|---|---|---|
and | and 表达式1 表达式2 | 表达式1 && 表达式2 | 表达式1和表达式2都为真的时候返回true |
or | or 表达式1 表达式2 | 表达式1 || 表达式2 | 表达式1和表达式2其中一个为真的时候返回true |
not | not 表达式 | !表达式 | 表达式为false则返回true, 反之返回false |
提示: 关系运算和逻辑运算函数通常跟if语句一起使用
例子:
{{$x := 100}}
//等价于$x == 100
{{if eq $x 100}}
...代码...
{{end}}
//等价于$x < 100
{{if lt $x 500}}
...代码...
{{end}}
//等价于$x >= 100
{{if ge $x 500}}
...代码...
{{end}}
//等价于$x > 50 && $x < 200
//这里调用了and函数和gt、lt三个函数, gt和lt函数的结果作为and的参数,gt和lt函数调用分别用括号包括起来
{{if and (gt $x 50) (lt $x 200)}}
...代码...
{{end}}
{{$y := 200}}
//等价于$x > 100 || $y > 100
{{if or (gt $x 100) (gt $y 100)}}
...代码...
{{end}}
2.2. html函数
对html内容进行转义处理,前面的例子已经介绍。
2.3. len函数
用于计算数组大小。
例子:
数组大小: {{len .}}
假如传入的模板参数是一个数组:
//模板参数定义如下
a := []int{1,2,3,4}
输出:
数组大小: 4
2.4. printf函数
主要用于格式化字符串,是go fmt.Sprintf函数的别名,前面的例子已经介绍。
2.5. urlquery函数
主要用于url编码。
例子:
/search?keyword={{urlquery "搜索关键词"}}
输出:
/search?keyword=%E6%90%9C%E7%B4%A2%E5%85%B3%E9%94%AE%E8%AF%8D
3.pipeline
pipeline 翻译过来可以称为管道或者流水线, pipeline运算的作用是将多个函数调用或者值串起来,从左往右执行,左边执行的结果会传递给右边,形成一个任务流水。
pipeline运算符:| (竖线)
语法格式:
command1 | command2 | command3 ...
command可以是一个值,也可以是一个函数。
例子1:
{{"<h1>www.tizi365.com</h1>" | html}}
这里意思就是将第一个字符串值传递给html函数。
输出:
<h1>www.tizi365.com</h1>
例子2:
{{"关键词" | html | urlquery}}
这个例子就是先将 "关键词" 传递给html函数转义下html标签,然后在将html执行结果传递给urlquery函数进行url编码。
输出:
%E5%85%B3%E9%94%AE%E8%AF%8D
提示: 如果函数有多个参数,pipeline运算会将值传递给函数的最后一个参数, 例如: {{100 | printf "value=%d"}}, 这里将100传递给printf函数的最后一个参数。
4.自定义模板函数
内置的模板函数使用有限,我们可以自己定义模板函数。
下面代码展示如何自定义模板函数:
// 第一步,我们先创建FuncMap, 然后注册我们要定义的函数
// FuncMap是一个map类型
funcMap := template.FuncMap{
// "toupper" 就是我们在模板中可以调用的函数名,
// strings.ToUpper就是我们要注册的函数,
// 他的作用是将小写字母转成大写字母,这里我们直接将golang自带的函数注入进去。
// 当然你也可以自己写一个函数
"toupper": strings.ToUpper,
}
// 这里定义个模板代码
const templateText = `
自定义函数调用例子:{{"abcdef" | toupper}}
`
// 创建一个template对象,模板名字为test,
// 然后调用Funcs注册我们定义的模板函数,
// 然后调用Parse加载templateText模板代码。
tmpl, err := template.New("test").Funcs(funcMap).Parse(templateText)
if err != nil {
log.Fatalf("解析模板失败: %s", err)
}
// 渲染模板
err = tmpl.Execute(os.Stdout, "")
if err != nil {
log.Fatalf("渲染模板失败: %s", err)
}
输出:
自定义函数调用例子:ABCDEF