Go中html/template渲染HTML的核心是“数据+模板+安全插值”,通过预编译、自动转义和上下文感知防XSS,适合服务端渲染。

在 Go 中用 html/template 渲染 HTML 页面,核心是“数据 + 模板 + 安全插值”。它不是拼字符串,而是通过预编译模板、自动转义、上下文感知来防止 XSS,适合构建服务端渲染的动态页面。
准备结构化数据并传递给模板
模板本身不处理业务逻辑,只负责展示。你需要先组织好数据(通常用 struct 或 map),再传给模板执行。
- 定义清晰的结构体,字段首字母大写(导出)才能被模板访问
- 避免在模板里做计算或条件嵌套过深,逻辑尽量前置到 handler 中
- 示例:
Title string
Users []User
IsAdmin bool
}
编写安全且可复用的 HTML 模板
使用 {{}} 插入变量、调用函数、控制流程。所有输出默认自动 HTML 转义,除非显式声明安全。
-
{{.Title}}输出结构体字段,点号表示当前作用域 -
{{range .Users}} {{.Name}} {{end}}遍历切片,内部作用域变为当前元素 -
{{if .IsAdmin}}管理员{{else}}普通用户{{end}}条件判断 - 如需插入原始 HTML(比如富文本内容),用
{{.Content | safeHTML}},但必须确保内容可信
加载和执行模板的典型流程
推荐用 template.ParseFiles 或 template.ParseGlob 加载多个文件,支持嵌套(如 {{template "header" .}})。
立即学习“go语言免费学习笔记(深入)”;
- 模板文件建议放在
templates/目录下,后缀为.html - 一次解析、多次执行:将
*template.Template存为全局变量或依赖注入,避免每次请求都解析 - 执行时用
t.Execute(w, data),w是http.ResponseWriter,会自动设置Content-Type: text/html; charset=utf-8
处理常见需求的小技巧
模板能力有限,但配合自定义函数能覆盖大部分场景。
- 格式化时间:
{{.CreatedAt | formatTime "2006-01-02"}},需提前注册formatTime函数 - 截取字符串:
{{.Summary | truncate 100}},函数返回template.HTML类型可绕过转义 - 静态资源路径:用
{{.StaticURL}}/css/app.css,把 CDN 或版本前缀从模板中解耦出来 - 错误处理:检查
t.Execute返回的 error,通常是模板语法错或字段不存在,开发期要关注日志











