
在go模板中使用`{{template}}`时如何正确传递数据到子模板
当你在主模板(如 `post.html`)中通过 `{{template "header.html"}}` 引入子模板(partial)时,Go 的 `text/template` 包**不会自动将当前数据上下文(即 `page` 结构体)传递给被调用的子模板**。这意味着 `header.html` 中的 `{{.Title}}` 实际上是在一个空上下文中求值——`.Title` 为空字符串,导致 `✅ 正确做法是:显式传递当前数据上下文,即改用:
{{template "header.html" .}}其中 . 表示当前执行上下文(即传入 t.Execute(f, page) 的 Page 实例)。这样 header.html 就能正常访问 .Title 和 .Body 等字段。
? 修改建议(仅需一行):
将 templates/post.html 中的:
{{template "header.html"}}改为:
{{template "header.html" .}}? 补充说明:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
- {{template "name"}}:无参调用,子模板接收 nil 上下文(或上一次 with/range 的残留,但通常为空);
- {{template "name" .}}:将当前作用域完整传递;
- {{template "name" $}} 或 {{template "name" .Page}}:可传递任意变量,适用于嵌套结构或需要局部数据隔离的场景。
⚠️ 注意事项:
- 模板名称必须与文件名或 define 块名称严格匹配(区分大小写);
- ParseGlob("templates/*html") 会自动加载所有 HTML 文件并注册其文件名(不含路径)为模板名,因此 header.html 对应模板名 "header.html" 是正确的;
- 若后续需复用 header 于不同结构体(如带 SiteName 的 Site + Page 组合),推荐使用 with 或预定义局部变量提升可维护性。
✅ 最终验证:运行程序后生成的 index.html 将正确渲染为:
I'm the title
And I'm the body
掌握 {{template "name" .}} 这一模式,是构建模块化 Go HTML 模板的基础实践。









