跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Golang html/template模板如何用_Golang HTML模板教程【高效】

Go 的 html/template 不支持全局变量,所有数据必须显式传入;{{.}} 是传入的 data 本身,{{$.}} 指最外层 data,不存在预定义的 \_ 变量;应通过结构体组织数据、FuncMap 注入函数实现复用。 Go 的
html/template
不支持直接访问全局变量(比如
_
或类似 JS 里的全局上下文),所谓 “用
_
” 是常见误解,根源是混淆了其他模板引擎(如 Handlebars、EJS)的语法。 为什么
html/template
里写
{{._}}
{{$.}}
会报错或没效果 Go 模板没有 “全局作用域” 概念,所有数据都来自你显式传入的
data
参数(即
Execute
的第二个参数)。
{{.}}
就是那个传入值本身,
{{$.}}
是指最外层的 data(在嵌套
{{with}}
{{range}}
时有用),但不存在一个叫
_
的预定义变量。 如果你看到别人用了
_
,大概率是他们自己把数据包装成了
map[string]interface{}{"_": xxx}
,然后在模板里写
{{._.User.Name}}
直接写
{{._}}
会触发
template: cannot evaluate field _ in type ...
html/template
为安全默认禁止任意字段访问,未导出字段(小写开头)根本不可达 想让多个模板共享配置或工具函数,该怎么做 Go 模板靠
FuncMap
注入函数、靠结构体/映射组织数据,不是靠“全局变量”。真正高效的做法是统一准备数据结构 + 预注册函数。 用
template.FuncMap
注册常用工具函数,比如
"now": func() time.Time { return time.Now() }
,模板中直接写
{{now}}
把需要跨模板复用的数据(如站点名、CDN 地址)塞进顶层结构体字段,例如
type PageData struct { SiteName string; User *User; Content interface{} }
,然后
tmpl.Execute(w, PageData{...})
避免用
map[string]interface{}
做顶层 data —— 类型不安全、IDE 无提示、容易拼错 key 如果必须动态加字段,用嵌套结构体:主结构体嵌入一个
BaseData
字段,各 handler 只需设置
BaseData
公共部分
template.ParseFiles
template.New
配合
FuncMap
的典型写法 这是生产环境最稳的初始化方式,兼顾可读性、复用性和类型安全。 使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件 如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Andr​​oid友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Andr​​oid应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更 下载 立即学习 “ go语言免费学习笔记(深入) ”;
func NewTemplate() (*template.Template, error) { t := template.New("base").Funcs(template.FuncMap{ "formatDate": func(t time.Time) string { return t.Format("2006-01-02") }, "add": func(a, b int) int { return a + b }, }) return t.ParseGlob("templates/*.html") }
必须先调
Funcs
ParseGlob
,否则新解析的子模板拿不到函数 子模板(如
{{template "header" .}}
)共享父模板的
FuncMap
,无需重复注册 不要在每次
Execute
前重新
Parse
—— 解析开销大,且并发不安全;应只解析一次,复用
*template.Template
实例 真正难的不是语法,而是设计 data 结构时要不要提前预留扩展字段、函数要不要带 context、错误是否该透出到模板层 —— 这些决定比怎么写
{{.User.Name}}
影响更大。

相关文章