下一个代码非常适合在 HomeTemplate 中输出一个 slice 。
主.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()
}
在模板中 forks 下一段代码:
{{ range . }}
{{ .Name }}<br />
{{ end }}
为什么这样的东西不起作用?
{{ range .resItems }}
{{ .Name }}<br />
{{ end }}
如果我想输出两个或更多 slice ,我需要做什么或改变什么?
谢谢
最佳答案
第一个问题,为什么rang .resItems
不起作用。
在模板中,.
表示当前项。就像java中的this
。
如果.
在某个方向如range
,则表示来自range
操作的项目。
如果不是,则表示您从 ExecuteTemplate()
方法传递的项目。就像在 ExecuteTemplate(w, "HomeTemplate", resItems)
中一样,.
表示 resItems
。所以你不能使用 .resItems
因为这意味着 resItems
有一个名为 resItems
的值。
其次,如果您有更多 slice 要传递给模板,您可以将它们全部添加到 map 中,如下所示:
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,将它们添加到映射中,然后将其传递给模板。在template中,.
表示 map ,.first
得到的是数组aa。 bb 也是如此。
希望对你有帮助...
关于templates - 转到模板 : two or more slices ranges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40324594/