
在Go模板中实现多层range嵌套时,需确保Go结构体字段类型与JSON数据严格一致;若Keywords为字符串数组,结构体应定义为[]string,并在内层range中直接使用.访问每个字符串元素。
在go模板中实现多层range嵌套时,需确保go结构体字段类型与json数据严格一致;若keywords为字符串数组,结构体应定义为[]string,并在内层range中直接使用`.`访问每个字符串元素。
Go模板不支持JavaScript式的动态属性访问,其range动作的行为完全依赖于Go反射对底层值的解析。当JSON中"keywords"字段是字符串数组(如["CSS", "HTML", "Javascript"])时,对应的Go结构体字段必须声明为[]string,而非自定义结构体切片(如[]KeywordsInfo)。否则,模板引擎无法正确解包,导致内层range迭代出空值或索引数字(如0 {} 1 {} 2),这正是因类型不匹配引发的典型表现。
正确的结构体定义如下:
type SkillsInfo struct {
Name string
Level string
Keywords []string // ✅ 匹配JSON中的字符串数组
}对应模板应简化内层range逻辑,无需声明键值变量(因字符串切片无键名),直接使用.引用当前字符串元素:
{{range .Resume.Skills}}
{{.Name}}
{{.Level}}
{{range .Keywords}}
{{.}} <!-- ✅ . 即当前字符串,如 "CSS" -->
{{end}}
{{end}}⚠️ 注意事项:
- 若坚持使用[]KeywordsInfo结构体,JSON必须形如"keywords": [{"keyword": "CSS"}, {"keyword": "HTML"}],且模板需改为{{range .Keywords}}{{.Keyword}}{{end}};
- Go模板中$key, $item := range slice仅适用于map或带索引/值语义的集合;对[]string使用此语法会导致$key为索引(int)、$item为字符串,但通常只需遍历值,故推荐{{range .Keywords}}{{.}}{{end}};
- 模板执行前务必验证结构体标签(如json:"keywords")与JSON字段名一致,避免反序列化失败导致字段为空。
通过保持Go类型与JSON结构精确对齐,并采用简洁的.语法访问切片元素,即可可靠实现多层级数据渲染。


















