You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go中如何迭代嵌套结构体?迭代报错问题求助

解决Go模板中Range无法迭代FamilyMembers的问题

错误根源

你定义的FamilyMembers是结构体类型,Go模板的range仅支持迭代切片、数组、map这类可遍历类型,直接对FamilyMembers执行range必然报错。同时你的数据存在多层嵌套:FamilyMembers包含Family切片,每个Family下又有Parents→Parent切片、Children→Child切片,只有最底层的Parent和Child才是需要展示的单个家庭成员数据。

解决方案1:模板内逐层遍历嵌套结构

修改模板代码,逐层深入到目标切片,分别遍历父母和孩子数据:

{{ if .FamilyMembers }}
    <table>
      <thead>
         <tr>
           <th>Names</th>
           <th>Gender</th>
           <th>Born</th>
         </tr>
       </thead>
       <tbody>
          <!-- 遍历Family切片 -->
          {{ range .FamilyMembers.Family }}
              <!-- 遍历当前Family下的所有父母 -->
              {{ range .Parents }}
                  {{ range .Parent }}
                  <tr>
                     <td>{{ .FirstName }} {{ .MidleName }} {{ .SurName }}</td>
                     <td>{{ .Gender }}</td>
                     <td>{{ .DoB }}</td>
                  </tr>
                  {{ end }}
              {{ end }}
              <!-- 遍历当前Family下的所有孩子 -->
              {{ range .Children }}
                  {{ range .Child }}
                  <tr>
                     <td>{{ .FirstName }} {{ .MidleName }} {{ .SurName }}</td>
                     <td>{{ .Gender }}</td>
                     <td>{{ .DoB }}</td>
                  </tr>
                  {{ end }}
              {{ end }}
          {{ end }}
       </tbody>
   </table>
 {{ else }}
    <h5 class="mt-3 text-center">No family details</h5>
{{ end }}

解决方案2:Go代码预处理扁平数据

如果不想让模板逻辑太复杂,可以在Go代码中将所有家庭成员整理成扁平切片,再传递给模板:

Go代码示例

// 定义统一的家庭成员结构体
type FamilyMember struct {
    FirstName string
    MidleName string
    SurName   string
    Gender    string
    DoB       string
}

// 从FamilyMembers中提取所有成员并扁平化
func flattenFamilyMembers(fm FamilyMembers) []FamilyMember {
    var members []FamilyMember
    for _, family := range fm.Family {
        // 收集父母数据
        for _, parents := range family.Parents {
            for _, p := range parents.Parent {
                members = append(members, FamilyMember{
                    FirstName: p.FirstName,
                    MidleName: p.MidleName,
                    SurName:   p.SurName,
                    Gender:    p.Gender,
                    DoB:       p.DoB,
                })
            }
        }
        // 收集孩子数据
        for _, children := range family.Children {
            for _, c := range children.Child {
                members = append(members, FamilyMember{
                    FirstName: c.FirstName,
                    MidleName: c.MidleName,
                    SurName:   c.SurName,
                    Gender:    c.Gender,
                    DoB:       c.DoB,
                })
            }
        }
    }
    return members
}

// 传递数据给模板时使用扁平后的切片
members := flattenFamilyMembers(yourFamilyData)
err := tmpl.Execute(w, map[string]interface{}{
    "FamilyMembers": members,
})

简化后的模板代码

{{ if .FamilyMembers }}
    <table>
      <thead>
         <tr>
           <th>Names</th>
           <th>Gender</th>
           <th>Born</th>
         </tr>
       </thead>
       <tbody>
          {{ range .FamilyMembers }}
          <tr>
             <td>{{ .FirstName }} {{ .MidleName }} {{ .SurName }}</td>
             <td>{{ .Gender }}</td>
             <td>{{ .DoB }}</td>
          </tr>
          {{ end }}
       </tbody>
   </table>
 {{ else }}
    <h5 class="mt-3 text-center">No family details</h5>
{{ end }}

内容的提问来源于stack exchange,提问作者Newdev Eloperj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:55:34