如何发送地图数组并使用 gin-templating 对其进行迭代

How to send an array of maps and iterate over it using gin-templating

以下是工作代码的片段。我正在使用 gin 模板引擎。

c.HTML(200, "index", gin.H{
            "title":    "Welcome",
            "students": map[int]map[string]string{1: {"PID": "1", "Name": "myName"}},})

在索引模板中我有:

 <TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range $student := .students}}
        <td>{{$student.Name}}</td>                    
        {{end}}
 </TABLE>

如您所见,我在 headers(地图)上有 hard-coded students 的值。我想从我构建的 rest API 中获取这些数据。我休息的响应 API 是一个数组:

 [
  {
    "id": 1,
    "name": "Mary"
  },
  {
    "id": 2,
    "name": "John"
  }
]

我可以将此 JSON 响应解组为 map[string]string 而不是 map[int]map[string]string。如何将这个未编组的 body 参数值传递给学生,然后遍历这个索引模板数组?

有结构

您拥有的是一个 JSON 数组,将其解组为 Go 切片。建议创建一个 Student 结构来为您的学生建模,让他们拥有干净而有意识的 Go 代码。

并且在模板中,{{range}} 操作将点 . 设置为当前元素,您可以在 {{range}} 正文中将其简单地称为点 ., 因此学生姓名将为 .Name.

工作代码(在 Go Playground 上尝试):

func main() {
    t := template.Must(template.New("").Parse(templ))
    var students []Student
    if err := json.Unmarshal([]byte(jsondata), &students); err != nil {
        panic(err)
    }
    params := map[string]interface{}{"Students": students}
    if err := t.Execute(os.Stdout, params); err != nil {
        panic(nil)
    }
}

const jsondata = `[
  {
    "id": 1,
    "name": "Mary"
  },
  {
    "id": 2,
    "name": "John"
  }
]`

const templ = `<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range .Students}}
        <td>{{.Name}}</td>                    
        {{end}}
 </TABLE>`

输出:

<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>

        <td>Mary</td>                    

        <td>John</td>                    

 </TABLE>

有地图

如果您不想创建和使用 Student 结构,您仍然可以使用类型为 map[string]interface{} 的简单映射来实现,它可以表示任何 JSON 对象,但要知道,在这种情况下,您必须将学生姓名称为 .name,因为它在 JSON 文本中是这样显示的,因此小写的 "name" 键将用于未编组的 Go 地图:

func main() {
    t := template.Must(template.New("").Parse(templ))
    var students []map[string]interface{}
    if err := json.Unmarshal([]byte(jsondata), &students); err != nil {
        panic(err)
    }
    params := map[string]interface{}{"Students": students}
    if err := t.Execute(os.Stdout, params); err != nil {
        panic(nil)
    }
}

const templ = `<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range .Students}}
        <td>{{.name}}</td>                    
        {{end}}
 </TABLE>`

输出相同。在 Go Playground.

上试试这个变体