Go 模板中的参数、变量、管道与函数
参数
参数就是模板里面用到的值。它的取值有多种,可以是布尔值、字符串、字符、整数、浮点数、虚数和复数等字面量,也可以是结构体、结构体中的一个字段或 map 中的一个键(结构体的字段名必须是导出的,即大写字母开头,map 的键名则不必),还可以是变量、方法(返回单个值或返回一个值和一个错误)或函数(返回单个值或返回一个值和一个错误)。参数还可以是一个点 .
,也就是传入模板引擎的那个值。
例如上一期讲到的条件 Action 中的 arg
就是参数:
变量
在 Action 中可以设置变量,变量以 $
开头,例如:
声明变量的 Action 不产生输出。变量可以重新被赋值:
在迭代/遍历类 Action 中可以定义两个变量:
这样就可以在循环中通过 $key
和 $value
访问索引和元素了。
管道
管道和 Unix 中的管道类似,是按顺序连接到一起的参数、函数和方法。例如:
p1、p2、p3 要么是参数,要么是(可能带有参数的)函数调用或方法调用。管道允许我们把命令的结果作为下一个命令的最后一个参数,下一个参数由管道 |
分隔开。下面是一个例子,模板如下:
其中 printf
是 Go 模板内置的函数,Go 代码如下:
运行程序并访问 http://localhost:8080/action
可以看到显示结果为 3.14
,结果进行了四舍五入。
函数
Go 模板提供了大量的内置函数,如果有特殊需求也可以实现自定义函数。模板执行时,遇到函数调用,先从模板自定义函数表中查找,而后查找全局函数表。
内置函数
内置函数分为以下几类:
- 逻辑运算:and 、 or 、 not
- 比较运算:eq 、 ne 、 lt 、 le 、 gt 、 ge
- 组合模板函数:define 、 template 、 block
- 调用操作:call
- 格式化操作:print 、 printf 、 println ,与用参数直接调用 fmt.Sprint/Sprintf/Sprintln 得到的内容相同
- 转义:html、js、urlquery 函数对字符串进行转义,防止安全问题。如果是 Web 模板,那么不会需要经常使用这些函数
自定义函数
默认情况下,模板中无自定义函数,可以使用模板的 Funcs
方法添加。Funcs
方法如下:
其中 FuncMap
类型如下:
map 中的 value
是函数,这些函数可以有任意数量的参数,返回单个值的函数或返回一个值加上一个错误的函数。
那么要如何创建自定义函数呢?首先,创建一个 FuncMap
(map 类型),其中 key
是函数名, value
就是函数。然后把 FuncMap
附加到模板即可。例如:
template.html 如下,其中 fdate
是我们自定义的函数,函数名是 map
中的 key
:
运行程序并访问 http://localhost:8080/action
可以看到显示的是当前的日期。上面的例子我们是在管道中使用了自定义函数,当然,我们也可以作为正常函数使用。