text/template
text/template
是 Golang 标准库,实现数据驱动模板以生成文本输出,可理解为一组文本按照特定格式嵌套动态嵌入另一组文本中。可用来开发代码生成器。
text/template
包是数据驱动的文本输出模板,即在编写好的模板中填充数据。一般而言,模板使用流程分为三个步骤:定义模板、解析模板、数据驱动模板。
package main
import (
"os"
"text/template"
)
func main() {
//创建模板
id := 100
tmpl, err := template.New("tplname").Parse("id = {{.}}")
if err != nil {
panic(err)
}
//模板合并输出
err = tmpl.Execute(os.Stdout, id)
if err != nil {
panic(err)
}
}
// output: id = 100
Actions
{{.}}
中.
点号表示传入模板的数据,代表当前作用域的当前对象.
点可代表 Golang 的任何类型,比如 Struct、Map 等。{{
和}}
包裹的内容统称为Actions
模板的输入文本是任何格式的 UTF-8 编码文本,,action
可分为两种:
- 数据求值(data evaluations):
action
数据求值的结果会直接复制到模板中 - 控制结构(control structures):
action
控制结构和 Golang 程序类似,也是条件语句、循环语句、变量、函数调用等
将模板成功解析后可安全地在并发环境中使用,若输出到同一个 io.Writer
数据可能会重叠,不能保证并发执行的先后顺序。
分类
下面是一个 action(动作)的列表。"Arguments" 和 "pipelines" 代表数据的执行结果,细节定义在后面。
-
{{/* a comment */}}
- 注释,执行时会忽略。可以多行。注释不能嵌套,并且必须紧贴分界符始止,就像这里表示的一样。
-
{{pipeline}}
- pipeline 的值的默认文本表示会被拷贝到输出里。
-
{{if pipeline}} T1 {{end}}
- 如果 pipeline 的值为 empty,不产生输出,否则输出 T1 执行结果。不改变 dot 的值。
- Empty 值包括 false、0、任意 nil 指针或者 nil 接口,任意长度为 0 的数组、切片、字典。
-
{{if pipeline}} T1 {{else}} T0 {{end}}
- 如果 pipeline 的值为 empty,输出 T0 执行结果,否则输出 T1 执行结果。不改变 dot 的值。
-
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
- 用于简化 if-else 链条,else action 可以直接包含另一个 if;等价于:
{{if pipeline}} T1 {{else}}{{if pipeline}} T0 {{end}}{{end}}
- 用于简化 if-else 链条,else action 可以直接包含另一个 if;等价于:
-
{{range pipeline}} T1 {{end}}
- pipeline 的值必须是 array、slice、map 或者 chan。
- 如果 pipeline 的值其长度为 0,不会有任何输出;否则 dot 依次设为 array、slice、map 或者 chan 的每一个成员元素并执行 T1;
- 如果 pipeline 的值为 map,且键可排序的基本类型,元素也会按键的顺序排序。
-
{{range pipeline}} T1 {{else}} T0 {{end}}
- pipeline 的值必须是数组、切片、字典或者通道。