一个参数(argument)就是模板中的一个值。它可以是布尔值、整数、字符串等字面量,也可以是结构、结构中的一个字段或者数组中的一个键。除此之外,参数还可以是一个变量、一个方法(这个方法必须只返回一个值,或者只返回一个值和一个错误)或者一个函数。最后,参数也可以是一个点.
,用于表示处理器向模板引擎传递的数据。
比如说,在以下这个例子中,arg
是一个参数:
{{ if arg }}
some content
{{ end }}
除了参数之外,用户还可以在动作中设置变量。变量以美元符号$
开头,就像这样:
$variable := value
初看上去,变量似乎并没有什么特别大的用处,但实际上它们对动作来说是非常重要的。作为例子,以下代码展示了怎样使用变量去实现迭代动作的一个变种:
{{ range $key, $value := . }}
The key is {{ $key }} and the value is {{ $value }}
{{ end }}
在这个例子中,点.
是一个映射,而动作range
在迭代这个映射的时候,会将变量$key
和$value
分别初始化为当前被迭代映射元素的键和值。
模板中的管道(pipeline)是多个有序地串联起来的参数、函数和方法,它的工作方式和语法跟Unix的管道也非常相似:
{{ p1 | p2 | p3 }}
这里的p1
、p2
和p3
可以是参数或者函数。管道允许用户将一个参数的输出传递给下一个参数,而各个参数之间则使用|
分隔。代码清单5-13展示了一个管道的使用示例。
代码清单5-13 模板中的管道
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Go Web Programming</title>
</head>
<body>
{{ 12.3456 | printf "%.2f" }}
</body>
</html>
为了更好地显示内容,用户经常需要在模板中对数据进行格式化。比如,在代码清单5-13所示的例子中,我们想要在显示浮点数的时候只保留两位小数精度。为了做到这一点,我们可以使用fmt.Sprintf
函数或者模板内置的printf
函数对浮点数进行格式化(这个printf
函数实际上就是fmt.Sprintf
函数的别名)。
除此之外,我们还通过管道将数字12.3456
传递给了printf
函数,并在printf
函数的第一个参数中指定了格式指示符(specifier),最终,这个管道将返回12.35作为结果。
虽然管道已经非常强大,但它还不是模板提供的最为强大的功能,接下来的一节要介绍的函数才是。