
Go 语言标准库提供了功能强大且安全的模板系统(text/template 和 html/template),支持循环、条件判断、变量插值等常见模板操作,并能自动防止 XSS 等安全风险。
go 语言标准库提供了功能强大且安全的模板系统(`text/template` 和 `html/template`),支持循环、条件判断、变量插值等常见模板操作,并能自动防止 xss 等安全风险。
Go 原生支持模板渲染,无需引入第三方库。其核心模板包分为两类:
- text/template:通用文本模板,适用于生成配置文件、日志、脚本等纯文本内容;
- html/template:专为 HTML 设计,在 text/template 基础上增加了上下文敏感的自动转义机制(如对 , ", ', & 等字符在不同 HTML 位置做差异化编码),可有效防范跨站脚本(XSS)攻击。
以 Puppet 中常见的 ERB 循环为例:
Some stuff with
在 Go 中,等效写法如下(使用 text/template):
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
⚠️ 注意事项:
- 模板中 . 表示当前作用域的值(如 range 迭代时的每个元素);
- 结构体字段名必须首字母大写(即导出字段),否则模板无法访问;
- 若用于 HTML 渲染,请务必使用 html/template 替代 text/template,避免手动转义遗漏;
- 可通过自定义函数(FuncMap)扩展模板能力,例如添加 urlquery、dateformat 等辅助函数;
- 模板解析(Parse)应尽量在初始化阶段完成,而非每次渲染时重复调用,以提升性能。
总结:Go 的模板系统简洁、安全、高效,是构建配置生成器、静态站点、邮件模板或服务端 HTML 渲染的理想选择。合理选用 text/template 或 html/template,并结合结构化数据传递,即可替代 ERB、Jinja2 等传统模板方案。











