为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白衣染霜花 2021-12-07 18:47:18
我想将两个数据对象传递给 Go Template。一个是 MongoDB 查询结果,另一个是整数数组。MongoDB 查询:-var results []Usersess, 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 的结构字段)请告诉我如何传递这些数据以及如何在模板中访问它们。
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

你可以仅通过一个单一的值,但该值可以是一个由多个值,例如一个结构,地图或切片的值。因此,只需将用于模板的多个数据包装在 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上试试。


其他方法...

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


例如,您还可以传入一个通道,接收将从中提供值。


另一种解决方案可能是注册自定义函数,调用时会返回值。


查看完整回答
反对 回复 2021-12-07
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您应该定义一个填充了数据库结果查询的结构,然后将该结构分配给该Execute方法。


tmpl.Execute需要一个Writer接口和一个struct


type Inventory struct {

    Material string

    Count    uint

}


items := Inventory{"trouser", 1}    

if err := GetTemplate("list").Execute(w, items); err != nil {

    // ... do your work

}


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信