template是Go语言的文本模板引擎,它提供了两个标准库。这两个标准库使用了同样的接口,但功能略有不同,具体如下:

    • text/template:基于模板输出文本内容
    • html/template:基于模板输出安全的HTML格式的内容,可以理解为其进行了转义,以避免受某些注入攻击

    简单示例:

    1. package main
    2. import (
    3. "html/template"
    4. "os"
    5. "strings"
    6. )
    7. const templateText = `
    8. output 0: {{title .Name1}}
    9. output 1: {{title .Name2}}
    10. output 2: {{.Name3 | title}}
    11. `
    12. func main() {
    13. funcMap := template.FuncMap{"title": strings.Title}
    14. tp1 := template.New("go-test")
    15. tp1,_=tp1.Funcs(funcMap).Parse(templateText)
    16. data := map[string]string{
    17. "Name1": "go",
    18. "Name2": "php",
    19. "Name3": "python",
    20. }
    21. _ = tp1.Execute(os.Stdout, data)
    22. }

    首先调用标准库text/template中的New方法,其根据我们给定的名称标识创建了一个全新的模板对象。接下来调用Parse方法,将常量templateText(预定义的待解析模板)解析为当前文本模板的主体内容。最后调用Execute 方法,进行模板渲染。简单来说,就是将传入的data动态参数渲染到对应的模板标识位上。因为我们将Execute方法的io.Writer指定到了os.Stdout中。

    template模板定义:

    • 双层大括号:也就是{{和}}标识符,在template中,所有的动作(Actions)、数据评估(Data Evaluations)、控制流转都需要用标识符双层大括号包裹,其余的模板内容均全部原样输出
    • 点(DOT):会根据点(DOT)标识符进行模板变量的渲染,其参数可以为任何值,但特殊的复杂类型需进行特殊处理。例如,当为指针时,内部会在必要时自动表示为指针所指向的值。如果执行结果生成了一个函数类型的值,如结构体的函数类型字段,那么该函数不会自动调用
    • 函数调用:在前面的代码中,通过FuncMap方法注册了名title的自定义函数。在模板渲染中一共用了两类处理方法,即使用{{title.Name1}}和管道符(|)对.Name3 进行处理。在template中,会把管道符前面的运算结果作为参数传递给管道符后面的函数,最终,命令的输出结果就是这个管道的运算结果