以下是工作代码的片段。我正在使用杜松子酒模板引擎。
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>
正如您所看到的,我在标题(地图)上对students
的值进行了硬编码。我希望从我构建的其他API获取此数据。我的rest API的响应是一个数组:
[
{
"id": 1,
"name": "Mary"
},
{
"id": 2,
"name": "John"
}
]
我可以将此JSON响应解组为map[string]string
而不是map[int]map[string]string
。如何在学生的参数值中传递这个未经传输的正文,然后在这个数组上迭代索引模板?
答案 0 :(得分:1)
你拥有的是一个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文本中的显示方式如此,因此在解组的Go地图中将使用小写的"name"
密钥:
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上尝试此变体。