Go 中用 text/template 动态生成文本需定义模板、传入导出字段结构体或 map 数据、调用 Execute 或 Go 1.22+ 的 ExecuteToString 渲染,支持 {{ .Field }} 取值、条件循环及 default 等管道操作。

在 Go 中用 text/template 生成文本并动态替换变量,核心是定义模板、传入数据(结构体或 map)、执行渲染。整个过程简洁明确,无需第三方库。
定义模板字符串或从文件加载
模板可以是硬编码的字符串,也可以从外部文件读取。字符串方式适合简单场景,比如生成日志、配置片段或邮件正文。
- 使用双大括号
{{ .FieldName }}引用结构体字段,或{{ .Key }}引用 map 的键 - 支持嵌套字段,如
{{ .User.Name }}(前提是User是导出字段且类型有导出的Name) - 从文件加载时用
template.ParseFiles("email.tmpl"),注意路径需可访问
准备数据:结构体或 map
Go 模板只能访问**导出(首字母大写)字段**。若用结构体,确保字段名大写;若用 map,键名区分大小写,但建议用字符串键(如 map[string]interface{})更灵活。
- 结构体示例:
type EmailData struct { To, Subject, Body string } - map 示例:
data := map[string]interface{}{"To": "user@example.com", "Subject": "Hello"} - 支持嵌套结构或 map,只要路径可访问(如
{{ .Info.Email }})
执行模板并捕获输出
调用 tmpl.Execute() 或 tmpl.ExecuteToString()(Go 1.22+ 新增)来生成结果。推荐用 bytes.Buffer 或 strings.Builder 接收输出。
立即学习“go语言免费学习笔记(深入)”;
- 基础写法:
err := tmpl.Execute(&buf, data),错误必须检查(如字段不存在、类型不匹配) - Go 1.22+ 可直接:
result, err := tmpl.ExecuteToString(data),更简洁 - 若要忽略空字段或提供默认值,用管道语法:
{{ .Name | default "Anonymous" }}
常用模板动作与安全提示
模板支持条件判断、循环、函数调用等,但 text/template 不会自动转义(适合纯文本),和 html/template 用途不同。
- 条件:
{{ if .Active }}Online{{ else }}Offline{{ end }} - 循环:
{{ range .Items }}- {{ .Name }}{{ end }}(.Items是切片或 map) - 避免注入:因是纯文本模板,不涉及 HTML,一般无需转义;但若最终用于 Shell/JSON 等上下文,需额外处理
- 调试技巧:用
{{ printf "%#v" . }}查看当前作用域数据结构










