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 的值必须是数组、切片、字典或者通道。