Go模板遍历切片必须用{{range}},字段名首字母须大写,切片需扁平化传入且路径严格匹配模板文件名。

直接传就行,但模板里遍历语法和结构体字段名必须严格匹配,否则渲染为空或 panic
模板中用 {{range}} 遍历切片,不是 {{for}} 或 {{foreach}}
Go 模板语法不支持 for 循环关键字,必须用 {{range}}。常见错误是写成 {{for .list}} 或漏掉 {{end}} 导致编译失败。
-
{{range .list}}进入遍历,当前项自动绑定为. - 想访问原结构体字段(比如
.Title),要确保切片元素是结构体类型,不能是[]string就去写.Title - 空切片不会报错,但
{{range}}块内内容完全不渲染 —— 这是预期行为,不是 bug
示例模板片段:
{{range .list}}
<p>{{.Title}} - {{.Content}}</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/gongju/2602" title="Gin框架 1.9.0"><img
src="https://img.php.cn/upload/manual/001/589/237/6a731f5b72949207.png" alt="Gin框架 1.9.0" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/gongju/2602" title="Gin框架 1.9.0">Gin框架 1.9.0</a>
<p>Gin框架 1.9.0版本源码包下载,版本号 1.9.0,适合需要 sonic JSON 支持、路由修复和内容协商改进的 Go Web 开发场景。</p>
</div>
<a href="/xiazai/gongju/2602" title="Gin框架 1.9.0" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>
{{else}}
<p>暂无内容</p>
{{end}}
c.HTML() 传参时,切片必须是字段值,不能藏在嵌套 map 里
很多人把数据包进多层 gin.H,比如 gin.H{"data": gin.H{"list": [...]}},结果模板里写 {{range .list}} 找不到 —— 因为实际路径是 .data.list。
- 正确做法:扁平化传,
gin.H{"list": []Article{...}} - 如果结构复杂,定义明确结构体比嵌套
gin.H更安全、IDE 可提示、编译期能捕获字段名错误 - 切片元素类型要一致;混用
string和struct{}会导致运行时报reflect: Call of method on nil interface value
加载模板时用 LoadHTMLGlob,路径通配符影响文件名匹配
模板文件名(含路径)就是 c.HTML() 第二个参数的字符串,Gin 不做任何转换。如果 LoadHTMLGlob("templates/**/*") 加载了 templates/admin/index.html,那必须写 c.HTML(200, "admin/index.html", ...),不能只写 "index.html"。
- 切片数据本身和路径无关,但模板没加载成功会导致
c.HTMLpanic:html/template: "admin/index.html" is undefined - 调试时先确认
r.LoadHTMLGlob的 pattern 是否真能匹配到文件(比如 Windows 路径分隔符差异) - 用
LoadHTMLFiles替代时,文件名必须带完整路径,且顺序无关
最常被忽略的是:切片元素字段名首字母必须大写,且 tag 中 json: 或 html: 不影响模板渲染 —— 模板只认 Go 字段名,不解析 tag。传了 []struct{title string},模板里写 {{.title}} 一定为空。

















