发布于2026-07-15 阅读(0)
扫一扫,手机访问
很多朋友在写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用.语法直接取值,多层级数据渲染就能稳稳跑通。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8