Gin渲染HTML需三要素:模板正确加载、数据字段可导出且键名严格一致;用LoadHTMLGlob注册模板,c.HTML()渲染并传data,模板中用{{.key}}取值,大小写敏感。

要在Gin中正确渲染HTML页面并把动态数据传进去,必须让模板文件被引擎识别、路径匹配准确、数据字段可导出且键名完全一致——三者缺一不可,否则页面空白或报错“template is undefined”。
加载模板:用LoadHTMLGlob批量注册所有HTML文件
第一步永远是加载模板,且必须在gin.Default()之后、任何路由注册之前执行。
直接写r.LoadHTMLGlob("templates/**/*"),它会递归扫描templates目录下所有子目录里的文件(含.html、.tmpl等),自动注册为可用模板名。
注意:通配符**代表任意层级子目录,*只匹配当前层;如果只写"templates/*.html",子目录里的index.html根本不会被加载。
立即学习“前端免费学习笔记(深入)”;
【必须确保templates/目录和可执行文件在同一级】。go run时工作目录可能不一致,但编译后./app运行时,Gin只认二进制所在位置的templates/,不是源码路径。
渲染页面:c.HTML()调用模板并传入数据
路由函数里调用c.HTML(200, "index.html", data)即可返回渲染结果。
第二个参数"index.html"必须和磁盘上文件名(不含路径)严格一致——如果你的文件是templates/user/profile.html,这里就填"profile.html",不是"user/profile.html",也不是"profile"。
第三个参数data支持三种写法:
方法一:用gin.H{"title": "首页", "items": []string{"A", "B"}},简洁直观,开发期首选。
方法二:定义结构体,字段首字母大写(否则模板无法访问):
type PageData struct { Title string; Items []string } → 传PageData{Title: "首页", Items: []string{"A","B"}}。
方法三:用map[string]interface{},灵活性高但类型不安全,容易拼错key。
模板内取值:变量、循环、条件判断全靠点语法
第一步:在templates/index.html里写{{.title}}就能输出gin.H里title对应的值,注意开头的点不能少。
第二步:遍历切片用{{range .items}} {{.}} {{end}},其中{{.}}代表当前迭代项。
第三步:条件判断写{{if .isAdmin}}
管理员入口
{{else}}
普通用户
{{end}},布尔字段必须导出(首字母大写)且传入true/false值。
第四步:嵌套结构如{{.User.Name}}要求User字段可导出,Name字段也可导出,中间用点逐级访问。
如果模板里写了{{.Title}}但传入的gin.H里是"title": "xxx",页面就显示空——大小写敏感,不报错,只静默失败。



















