如何使用Golang template生成文本模板_动态生成HTML或文本

Go template包通过结构化数据驱动模板生成HTML或文本,支持内联/文件模板、嵌套继承、安全转义及条件循环语法,需导出字段且自动处理nil。

Go 的 template 包是生成动态 HTML 或纯文本的高效工具,核心在于“数据驱动模板”——用结构化数据(如 struct、map)填充预定义的模板字符串,安全、灵活、无依赖。

定义并解析模板

模板可以内嵌在代码中,也可从文件加载。使用 template.New 创建模板对象,再用 ParseParseFiles 加载内容:

  • 内联模板:适合简单场景,用反引号包裹,保留换行和空格
  • 文件模板:推荐用于 HTML 页面,支持嵌套({{template "name" .}})和继承({{define "main"}}...{{end}}

注意:解析失败会返回 error,务必检查;重复调用 Parse 会覆盖已有定义,可改用 ParseGlob 批量加载。

传入数据并执行渲染

调用 Execute(写入 io.Writer,如 http.ResponseWriterbytes.Buffer)或 ExecuteToString(返回字符串):

  • 数据必须是导出字段(首字母大写)的 struct、map 或基本类型
  • 模板中用 {{.FieldName}} 访问结构体字段,{{.Key}} 访问 map 元素
  • 支持链式访问:{{.User.Profile.AvatarURL}},自动处理 nil 指针(不 panic,输出空)

常用控制语法与安全要点

模板语法简洁但功能完整:

  • 条件判断:{{if .Active}}在线{{else}}离线{{end}}
  • 循环遍历:{{range .Items}}{{.Name}} {{end}}{{range $index, $item := .Items}} 获取索引
  • HTML 自动转义:{{.Content}} 会转义 & 等字符,防止 XSS;需原样输出时用 {{.Content | safeHTML}}(仅限可信内容)
  • 自定义函数:用 Funcs 注册,例如 adddatetruncate 等辅助逻辑

实用技巧与常见避坑

提升开发效率和运行健壮性:

  • 模板命名区分用途:如 "user_list.html""email.txt",避免同名覆盖
  • 错误处理别忽略:执行时可能因字段缺失、类型不匹配失败,建议用 template.Must 在启动时捕获解析错误
  • HTML 模板建议加 text/template 注释说明用途,便于团队协作
  • 大量重复逻辑可抽为 define 模板块,再用 template 调用,提高复用性