gpt4 book ai didi

go - 如何将多个数据传递给 Go 模板?

转载 作者:IT王子 更新时间:2023-10-29 02:23:23 26 4
gpt4 key购买 nike

我想将两个数据对象传递给 Go Template。一个是 MongoDB 查询结果,另一个是整数数组。

MongoDB 查询:-

var results []User
sess, db := GetDatabase()
defer sess.Close()
c := db.C("user")
err := c.Find(nil).All(&results)

我想通过以下代码发送“结果”和一个 int 数组

GetTemplate("list").Execute(w,???????)

如果只有数据库结果,我们可以将其用作

GetTemplate("list").Execute(w,results)

在模板中我们可以访问它 {{.Name}} 等(其中 Name 是 []User 的结构字段)

请告诉我如何传递这些数据以及如何在模板中访问它们。

最佳答案

您只能传递一个值,但该值可以是多个值的组合值,例如结构、映射或 slice 。因此,只需将用于模板的多个数据包装在 structmap 中即可。

struct 示例:

type Data struct {
Results []User // Must be exported!
Other []int // Must be exported!
}

data := &Data{results, []int{1, 2, 3}}
if err := GetTemplate("list").Execute(w, data); err != nil {
// Handle error
}

另请注意,不需要新的命名类型,您也可以使用匿名结构文字,如下所示:

data := struct {
Results []User // Must be exported!
Other []int // Must be exported!
}{results, []int{1, 2, 3}}

带有 map 的示例:

m := map[string]interface{}{
"Results": results,
"Other": []int{1, 2, 3},
}

if err := GetTemplate("list").Execute(w, m); err != nil {
// Handle error
}

请注意,使用映射时,不需要使用大写的 string 作为键,例如你也可以使用 "results""other"(但在我看来,如果你移动到 struct,最好使用首字母大写的键 有时在未来,您需要做的修正会更少)。

在这两种情况下,您都可以使用 {{.Results}} 引用 []User 结果,并使用 {{.Other }}.

例如,对用户进行范围分析:

{{range .Results}}
User name:{{.Name}}
{{end}}

带有 slice 的示例:

s := []interface{}{
results,
[]int{1, 2, 3},
}

if err := GetTemplate("list").Execute(w, s); err != nil {
// Handle error
}

这可读性较差,但却是一个可行的解决方案。在模板中,您必须索引模板数据以获取“个人”值,例如:

{{range index . 0}}
User name:{{.Name}}
{{end}}

Other: {{index . 1}}

Go Playground 上试试.

其他方式...

还有其他“理论上”的方法,但我不会仅仅因为它有效就使用它们。

例如,您还可以传入一个 channel ,接收方将从该 channel 提供值。

另一种解决方案可能是 register custom functions调用时会返回值。

关于go - 如何将多个数据传递给 Go 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36130652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com