Golang模板引擎使用
最近在学习Golang的模板引擎,遇到几个问题想请教大家:
- 如何在模板中实现条件判断?比如根据不同的用户角色显示不同的内容
- 自定义函数在模板中如何注册和使用?能否举个实际应用的例子
- 模板嵌套时怎么处理变量作用域问题?子模板如何访问父模板的变量
- 性能优化方面有什么建议?比如缓存编译后的模板有什么最佳实践
- 模板中的管道操作符(|)有哪些常用的使用技巧?
2 回复
Golang内置html/template和text/template包,用于安全生成动态内容。支持数据绑定、条件判断、循环等。注意自动转义防XSS攻击,使用{{.}}输出变量,{{if}}、{{range}}控制逻辑。
更多关于Golang模板引擎使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go语言内置的text/template和html/template包提供了强大的模板引擎功能,用于生成动态文本或HTML内容。以下是核心用法:
1. 基础模板定义与解析
package main
import (
"os"
"text/template"
)
func main() {
// 定义模板
tmpl := `Hello, {{.Name}}! You have {{.Count}} new messages.`
// 解析模板
t, _ := template.New("test").Parse(tmpl)
// 执行模板(数据驱动)
data := struct {
Name string
Count int
}{
Name: "Alice",
Count: 5,
}
t.Execute(os.Stdout, data)
}
// 输出: Hello, Alice! You have 5 new messages.
2. 常用模板语法
{{.Field}}- 输出字段值{{if .Condition}}...{{end}}- 条件判断{{range .Items}}...{{end}}- 循环遍历{{template "name" .}}- 嵌入子模板
3. 安全HTML输出(html/template)
import "html/template"
func htmlExample() {
t, _ := template.New("html").Parse(`
<div>{{.Content}}</div>
<a href="{{.Link}}">Click</a>
`)
data := map[string]interface{}{
"Content": "<script>alert('xss')</script>",
"Link": "/path?q=1&x=2",
}
// 自动转义危险字符
t.Execute(os.Stdout, data)
}
// 输出: <div><script>alert('xss')</script></div>
4. 函数扩展
func main() {
// 自定义模板函数
funcMap := template.FuncMap{
"add": func(a, b int) int { return a + b },
}
t := template.Must(template.New("funcs").Funcs(funcMap).Parse(
`Result: {{add .Value 10}}`,
))
t.Execute(os.Stdout, map[string]int{"Value": 5})
// 输出: Result: 15
}
关键特性:
- 数据驱动:通过
{{.}}访问传入数据 - 自动上下文感知转义(html/template)
- 模板继承和组合支持
- 与Go语言类型系统紧密集成
建议在实际项目中优先使用html/template处理Web内容,以防XSS攻击。

