Go语言html/template包支持安全灵活的HTML模板渲染,需正确组织模板文件、传递导出字段结构体数据,利用{{if}}、{{range}}等语法处理动态逻辑,并通过define/template复用片段、Funcs注册函数提升可维护性。
Go语言内置的html/template包提供了安全、灵活的HTML模板渲染能力,适合动态生成网页内容。关键在于正确组织模板文件、传递结构化数据,并避免XSS等安全风险。
将HTML结构保存为独立文件(如index.html),使用template.ParseFiles()或template.ParseGlob()加载:
ParseGlob("templates/*.html")批量加载,便于管理多个模板{{.FieldName}}访问传入结构体字段,{{.}}表示整个数据对
象定义Go结构体匹配模板变量,创建实例后调用Execute()写入http.ResponseWriter:
map[string]interface{}也可传参,但类型安全性和可读性较差tmpl.Execute(w, struct{Title, Content string}{"首页", "欢迎访问"})
在模板中使用控制语法实现页面逻辑:
{{if .IsLoggedIn}}欢迎回来{{else}}请登录{{end}}{{range .Articles}}{{.Title}}
{{end}}{{with .User}}{{.Name}}
{{end}}html/template自动转义输出,防止XSS;若需原生HTML,用{{.Content | safeHTML}}并配合自定义函数大型项目建议分层组织模板,复用公共片段:
{{define "header"}}...{{end}}定义命名模板,再用{{template "header" .}}引入template.New("base").Funcs(customFuncs)注册辅助函数(如格式化时间、截取字符串)template.Must()快速捕获解析错误,生产环境预编译模板提升性能不复杂但容易忽略:确保HTTP响应头设置正确(如w.Header().Set("Content-Type", "text/html; charset=utf-8")),并始终校验用户输入后再传入模板。