【问题标题】:Go Templates: two or more slices rangesGo 模板:两个或多个切片范围
【发布时间】:2017-03-12 11:57:17
【问题描述】:

下一个代码非常适合在 HomeTemplate 中输出一个切片。

main.go

type Item struct {
    Id          int
    Name string
    Type      string
}

var tmpl = template.Must(template.ParseGlob("tmpl/*"))

func Index(w http.ResponseWriter, r *http.Request) {

    db := database.DbConn()

    selDB, err := product.ByID()
    if err != nil {
        panic(err.Error())
    }

    i := Item{}

    resItems := []Item{}

    for selDB.Next() {

        var id int
        var product_name, product_type string

        err = selDB.Scan(&id, &product_name, &product_type)
        if err != nil {
            panic(err.Error())
        }

        i.Id = id
        i.Name = product_name
        i.Type = product_type

        resItems = append(resItems, i)

    }

    tmpl.ExecuteTemplate(w, "HomeTemplate", resItems)

    // Close database connection
    defer db.Close()
}

在模板中fork好下一段代码:

{{ range . }}
    {{ .Name }}<br />
{{ end }}

为什么这样的东西不起作用?

{{ range .resItems }}
    {{ .Name }}<br />
{{ end }}

如果我想输出两个或更多切片,我需要做什么或改变什么?

谢谢

【问题讨论】:

  • 如果我想输出两个或多个切片,我需要做什么或改变什么? 你需要传递一个数据结构给ExecuteTemplate,它可以包含多个切片数据,例如结构。

标签: templates go range slice


【解决方案1】:

第一个问题,为什么rang .resItems 不起作用。
在模板中,. 表示当前项目。就像java中的this。 如果. 在某个方向,如range,则表示来自range 操作的项目。
如果不是,则表示您通过 ExecuteTemplate() 方法传递的项目。比如ExecuteTemplate(w, "HomeTemplate", resItems). 表示resItems。所以你不能使用.resItems,因为这意味着resItems有一个名为resItems的值。

其次,如果您有更多切片要传递给模板,您可以将它们全部添加到地图中,如下所示:

t := template.New("test")
t, _ = t.Parse(`
test range 
{{range .first}} {{.}} {{end}}
{{range .second}} {{.}} {{end}}
`)
var res = make(map[string]interface{})
aa := []string{"first", "second"}
bb := []string{"123", "456"}
res["first"] = aa
res["second"] = bb
t.Execute(os.Stdout, res)

// output
test range
 first  second
 123  456

我有两个数组 aa 和 bb,并将它们添加到地图中,然后将其传递给模板。在模板中,. 表示地图,.first 得到数组 aa。等等。

希望对你有帮助...

【讨论】:

  • 谢谢,这意味着我需要传递给模板的所有数据都必须在地图中,对吧?
  • 是的,映射或结构
猜你喜欢
  • 2019-05-16
  • 2016-07-06
  • 1970-01-01
  • 2013-04-21
  • 2014-09-30
  • 2021-09-16
  • 2016-11-11
  • 2019-06-06
相关资源
最近更新 更多