如何将多个对象传递给Go html模板

时间:2015-09-11 15:40:59

标签: go go-html-template

这是我的对象数组,

type PeopleCount []struct{
   Name  string
   Count int
}

type Consultation []struct{
   Name          string
   Opd_count     int
   Opinion_count int
   Req_count     int
}

我应该如何将对象传递给html模板并将它们排列在表格中?

2 个答案:

答案 0 :(得分:4)

定义一个匿名结构,其中包含人员计数和咨询的字段,并将结构传递给模板执行方法:

var data = struct {
    PeopleCounts  []PeopleCount
    Consultations []Consultation
}{
    PeopleCounts:  p,
    Consultations: c,
}
err := t.Execute(w, &data)
if err != nil {
    // handle error
}

在模板中使用这些字段:

{{range .PeopleCounts}}{{.Name}}
{{end}}
{{range .Consultations}}{{.Name}}
{{end}}

Playground example

您可以为模板数据声明命名类型。匿名类型声明的优点是模板数据的知识本地化为调用模板的函数。

您还可以使用地图而不是类型:

err := t.Execute(w, map[string]interface{}{"PeopleCounts": p, "Consultations": c})
if err != nil {
    // handle error
}

使用地图的缺点是模板中的拼写错误可能不会导致错误。例如,``{{range .PopleConts}} {{end}}`silent什么都不做。

上面的代码假设PeopleCount和Consultation是结构类型而不是匿名结构类型的片段:

type PeopleCount struct {
  Name  string
  Count int
}

type Consultation struct {
  Name          string
  Opd_count     int
  Opinion_count int
  Req_count     int
}

给元素一个命名类型通常比给切片命名类型更方便。

答案 1 :(得分:1)

如果您愿意,可以定义一个未导出的结构,其中包含人员计数和咨询的字段,并将结构传递给模板执行方法:

type viewModel struct {
    PeopleCounts  []PeopleCount
    Consultations []Consultation
}

// ...

var data = viewModel{
    PeopleCounts:  p,
    Consultations: c,
}
err := t.Execute(w, &data)
if err != nil {
    // handle error
}

这种方法与@Bravada的答案大致相似。无论是明确地还是匿名地使用视图模型类型,仅仅是个人品味的问题。