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攻击。
 
        
       
                     
                     
                    

