如何覆盖结构切片而不是切片结构

时间:2014-07-03 14:09:14

标签: html templates go struct go-templates

稍微使用了Go HTML模板,我发现在模板中循环对象的所有示例都是将切片的结构传递给模板,有点像这个例子:

type UserList struct {
    Id   []int
    Name []string
}

var templates = template.Must(template.ParseFiles("main.html"))

func rootHandler(w http.ResponseWriter, r *http.Request) {
    users := UserList{
        Id:   []int{0, 1, 2, 3, 4, 5, 6, 7},
        Name: []string{"user0", "user1", "user2", "user3", "user4"},
    }
    templates.ExecuteTemplate(w, "main", &users)
}

使用" main"模板是:

{{define "main"}}
    {{range .Name}}
        {{.}}
    {{end}}
{{end}}

这样做有效,但是如果我只在.Name属性上进行测距,我不明白我应该如何在其相应的名称旁边显示每个ID。我发现将每个用户视为一个对象,在显示时对其属性进行分组更为合乎逻辑。

因此我的问题是:

如果我想将一段结构传递给模板怎么办?如何使这个工作起来的语法是什么?我还没有找到或理解官方html /模板文档中的方法。 我想象一下这样的东西:

type User struct {
    Id   int
    Name string
}
type UserList []User
var myuserlist UserList = ...

和一个看起来有点像这样的模板:(这里的语法是刻意错误的,只是为了理解)

{{define "main"}}
    {{for each User from myuserlist as myuser}}
        {{myuser.Id}}
        {{myuser.Name}}
    {{end}}
{{end}}

2 个答案:

答案 0 :(得分:32)

使用:

{{range .}}
    {{.Id}}
    {{.Name}}
{{end}}

表示模板 这是一个例子:http://play.golang.org/p/A4BPJOcfpB
你需要阅读更多关于" dot"在包概述中,了解如何正确使用它。 http://golang.org/pkg/text/template/#pkg-overview(签出管道部分)

答案 1 :(得分:2)

我没有代表发表评论,但回答@ROMANIA_engineer,elithrar引用的来源已经退休,对于仍在寻找此引用的人来说:

  

本书已被删除,因为它很快将由APress出版。请参阅Network Programming with Go: Essential Skills for Using and Securing Networks