Go模板中嵌套range的正确用法:如何遍历结构体内的字符串切片
Go模板嵌套range时,结构体字段类型须与JSON数据严格对齐,字符串切片声明为[]string,内层用{{.}}直接取值;若类型不匹配,内层迭代会返回空值或索引。确保结构体标签与JSON字段名一致,避免反序列化失败。
很多朋友在写Go模板的时候,遇到多层range嵌套就头疼,尤其是当内层是一个字符串切片时,经常会出现一些意想不到的bug。其实核心就一句话:结构体字段类型必须和JSON数据严格对齐,该用[]string的地方就别写成自定义结构体切片。
咱们先把这个最核心的结论说清楚:在Go模板里做多层range嵌套,结构体字段类型和JSON数据格式必须严格对齐。如果JSON里的"keywords"字段是个字符串数组,比如["CSS", "HTML", "Ja vascript"],那么Go结构体里对应的字段就必须声明为[]string,而不是[]KeywordsInfo这样的自定义结构体切片。否则,模板引擎在解析的时候就会出乱子——内层range迭代出来的要么是空值,要么是一堆索引数字(比如0 {} 1 {} 2 {}),这就是典型的类型不匹配导致的“BUG现场”。
正确做法是这样的,先看结构体定义:
type SkillsInfo struct {
Name string
Level string
Keywords []string // ✅ 和JSON里的字符串数组一一对应
}
然后模板里的内层range逻辑就变得非常简单,因为字符串切片没有键名,直接用.就能拿到当前遍历的字符串元素:
{{range .Resume.Skills}}
{{.Name}}
{{.Level}}
{{range .Keywords}}
{{.}}
{{end}}
{{end}}
有几个新手容易踩的坑,我提一下:
- 如果你非要坚持用
[]KeywordsInfo这种结构体切片,那JSON格式必须改成"keywords": [{"keyword": "CSS"}, {"keyword": "HTML"}],模板里也要写成{{range .Keywords}}{{.Keyword}}{{end}}。两种方式都可以,但混着用肯定出问题。 - 关于
$key, $item := range slice这种写法,它只适用于map或者带索引/值语义的集合。对[]string用这个语法,$key会变成int类型的索引,$item才是字符串。不过大多数场景我们只需要遍历值,所以直接用{{range .Keywords}}{{.}}{{end}}最省心。 - 模板执行之前,一定要检查结构体标签(比如
json:"keywords")和JSON字段名是否一致,不然反序列化失败,字段直接为空,模板里再怎么折腾都是白搭。
说白了,Go模板的range动作靠的是反射机制,它不像Ja vaScript那样可以动态访问属性。类型对上了,一切顺风顺水;类型对不上,各种奇怪问题都会冒出来。只要把结构体类型和JSON结构对齐,内层range用.语法直接取值,多层级数据渲染就能稳稳跑通。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













