
本文详解 Go 模板中嵌套 range 的使用方法,重点解决因结构体字段类型与 JSON 数据不匹配导致的空渲染问题,并提供可直接运行的模板写法与结构体定义。
本文详解 go 模板中嵌套 `range` 的使用方法,重点解决因结构体字段类型与 json 数据不匹配导致的空渲染问题,并提供可直接运行的模板写法与结构体定义。
在 Go 模板中实现「range within range」(即外层循环内嵌另一层循环)是常见需求,例如渲染简历中的技能列表及其关联关键词。但若模板语法、结构体定义与实际 JSON 数据结构不一致,极易出现渲染为空(如 {} 或索引数字 0 {} 1 {})等异常现象。
关键问题在于:Go 结构体字段类型必须严格匹配反序列化后的 JSON 数据结构。从你提供的 JSON 片段可见:
"skills": [{
"name": "Web Development",
"level": "Master",
"keywords": ["CSS", "HTML", "Javascript"]
}]
其中 "keywords" 是一个字符串切片([]string),而非对象数组。但原始结构体将其定义为 []KeywordsInfo,导致 Go 解析时无法匹配,Keywords 字段被忽略或初始化为空切片,进而模板中 {{range .Keywords}} 遍历时无内容输出,甚至可能误将切片长度当作索引值渲染(如 0 {} 1 {})。
✅ 正确做法是统一类型:
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
type SkillsInfo struct {
Name string `json:"name"`
Level string `json:"level"`
Keywords []string `json:"keywords"` // ✅ 匹配 JSON 中的字符串数组
}
对应模板应简洁直接,无需引入额外变量(如 $item, $key),因为 Keywords 是 []string,{{.}} 即代表当前字符串元素:
{{range .Resume.Skills}}
<h3>{{.Name}} ({{.Level}})</h3>
-
{{range .Keywords}}
- {{.}} {{end}}
⚠️ 注意事项:
- 避免过度解构:对 []string 使用 {{range $index, $value := .Keywords}} 虽语法合法,但 $value 实际仍是字符串,$index 仅用于序号——除非需要索引,否则 {{range .Keywords}}{{.}}{{end}} 更清晰高效。
- JSON 标签不可省略:确保结构体字段含正确 json:"xxx" 标签,否则 json.Unmarshal 无法映射字段。
- 调试技巧:在模板中临时插入 {{printf "%#v" .Keywords}} 可直观查看实际解析出的数据结构,快速定位类型不匹配问题。
完整可运行示例见 Go Playground,验证了结构体、JSON 输入与模板三者协同工作的正确性。掌握这一模式后,任意层级的嵌套切片(如 Skills → Keywords、Work → Highlights)均可依此原则安全展开。










