Go语言中text/template用于动态文本渲染,支持变量绑定、条件判断、循环、函数调用和模板嵌套。通过{{}}插入逻辑,如{{.Name}}访问字段,if/range控制流程,Funcs注册函数,define定义子模板,实现灵活的纯文本生成,适用于配置文件、邮件、代码生成等场景。

在 Go 语言中,text/template 包提供了一种强大而简洁的方式来实现动态内容渲染。它常用于生成文本输出,比如配置文件、日志格式、邮件正文、代码生成等场景。与 html/template 不同,text/template 不做 HTML 转义,适用于纯文本场景。
基本语法与数据绑定
模板通过 {{ }} 来插入变量和控制逻辑。最简单的使用方式是定义一个字符串模板,并将结构体或 map 数据传入进行渲染。
示例:
// 定义结构体type User struct {
Name string
Age int
}
// 创建模板字符串
const templateStr = "Hello, {{.Name}}! You are {{.Age}} years old."\n\n// 执行渲染
t := template.Must(template.New("user").Parse(templateStr))
err := t.Execute(os.Stdout, User{Name: "Alice", Age: 18})
输出结果:
Hello, Alice! You are 18 years old.
立即学习“go语言免费学习笔记(深入)”;
{{.}} 表示当前作用域的数据对象,{{.Name}} 表示访问其字段。
条件判断与循环控制
模板支持 if、range 等控制结构,可用于动态生成内容。
条件判断:
{{if .IsAdult}}Welcome, adult user!
{{else}}
Access restricted.
{{end}}
遍历切片或 map:
Users:{{range .Users}}
- {{.Name}}, {{.Age}}
{{end}}
注意:range 会改变当前上下文(. 指向当前元素),end 必须闭合。
变量定义与函数调用
可以在模板内定义局部变量,使用 $ 符号命名:
{{range .Items}}{{$index := .ID}}
Item {{$index}}: {{.Name}}
{{end}}
也可以注册自定义函数,供模板调用:
funcMap := template.FuncMap{"upper": strings.ToUpper,
"add": func(a, b int) int { return a + b },
}
t := template.New("demo").Funcs(funcMap)
t, _ = t.Parse("{{upper .Text}}")
t.Execute(os.Stdout, map[string]string{"Text": "hello"})
输出:
HELLO
模板嵌套与组合
大型项目中可通过定义多个子模板并嵌套调用提升可维护性。
{{define "header"}}=== {{.Title}} ===
{{end}}
{{define "main"}}
{{template "header" .}}
Content: {{.Body}}
{{end}}
执行指定模板:
t.Lookup("main").Execute(os.Stdout, data)这种机制适合构建模块化模板系统,如邮件模板、报告生成等。
基本上就这些核心用法。掌握变量绑定、流程控制、函数注入和模板复用,就能灵活实现各种文本动态渲染需求。不复杂但容易忽略细节,比如作用域变化和函数注册时机。实际使用时建议结合 Must 或 error 处理确保模板正确加载。










