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

我想将两个数据对象传递给 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,???????)

如果只有 db 结果,我们可以将其用作


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

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


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


白衣染霜花
浏览 113回答 2
2回答

手掌心

你可以仅通过一个单一的值,但该值可以是一个由多个值,例如一个结构,地图或切片的值。因此,只需将用于模板的多个数据包装在 astruct或map.示例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}请注意,使用地图时,不需要使用大写的strings 作为键,例如您也可以使用"results"and "other"(但在我看来,最好使用带有大写起始字母的键,如果您struct将来有时会移动,您将有更少的修正)。在这两种情况下,您都可以使用 引用[]User结果,{{.Results}}并使用引用额外的 int 切片{{.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上试试。其他方法...还有其他“理论”方法,但我不会仅仅因为它有效而使用它们。例如,您还可以传入一个通道,接收将从中提供值。另一种解决方案可能是注册自定义函数,调用时会返回值。

杨__羊羊

您应该定义一个填充了数据库结果查询的结构,然后将该结构分配给该Execute方法。tmpl.Execute需要一个Writer接口和一个structtype Inventory struct {    Material string    Count    uint}items := Inventory{"trouser", 1}    if err := GetTemplate("list").Execute(w, items); err != nil {    // ... do your work}
打开App,查看更多内容
随时随地看视频慕课网APP