
Go 语言原生提供功能强大、安全高效的模板系统(text/template 和 html/template),支持数据遍历、条件判断、函数调用等,适用于配置生成、HTML 渲染、代码自动生成等多种场景。
go 语言原生提供功能强大、安全高效的模板系统(`text/template` 和 `html/template`),支持数据遍历、条件判断、函数调用等,适用于配置生成、html 渲染、代码自动生成等多种场景。
Go 并未采用类似 Puppet ERB 的嵌入式 Ruby 风格模板,而是设计了一套简洁、类型安全、上下文感知的声明式模板语法。其核心由标准库中的两个包提供:
- text/template:通用纯文本模板引擎,适用于日志、配置文件、脚本等非 HTML 场景;
- html/template:专为 HTML 安全渲染设计,在插值时自动执行上下文敏感转义(如 HTML 实体、JS 字符串、CSS 属性等),有效防止 XSS 攻击。
以问题中 Puppet ERB 的循环示例为例:
Some stuff with
在 Go 模板中可直接对应为:
{{ range .Values }}
Some stuff with {{ . }}
{{ end }}
注意:.Values 是传入模板的数据结构字段名(通常为切片或数组),. 在 range 内部代表当前迭代项。完整使用流程如下:
package main
import (
"os"
"text/template"
)
func main() {
data := struct {
Values []string
}{
Values: []string{"apple", "banana", "cherry"},
}
tmpl := `{{ range .Values }}
Some stuff with {{ . }}
{{ end }}`
t := template.Must(template.New("example").Parse(tmpl))
t.Execute(os.Stdout, data)
}
输出结果为:
Some stuff with apple Some stuff with banana Some stuff with cherry
⚠️ 关键注意事项:
- 模板变量必须导出(首字母大写),否则无法访问;
- html/template 与 text/template 不兼容互换:若用 html/template 解析纯文本模板,可能因过度转义导致意料外输出;反之,用 text/template 渲染 HTML 易引发安全风险;
- 支持管道操作({{ .Name | title | printf "Hello %s" }})、自定义函数、嵌套模板({{ define "header" }}...{{ end }} + {{ template "header" . }})等高级特性;
- 模板解析应尽量在初始化阶段完成(template.Must(template.ParseFiles(...))),避免运行时重复解析影响性能。
总之,Go 模板虽语法精简,但表达力强、安全性高、集成度好,是构建可维护服务端生成逻辑的首选工具。











