很多朋友在写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}}

有几个新手容易踩的坑,我提一下:

说白了,Go模板的range动作靠的是反射机制,它不像Ja vaScript那样可以动态访问属性。类型对上了,一切顺风顺水;类型对不上,各种奇怪问题都会冒出来。只要把结构体类型和JSON结构对齐,内层range用.语法直接取值,多层级数据渲染就能稳稳跑通。

本文转载于:https://www.php.cn/faq/2822330.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。