如何遍历结构体切片而不是切片结构体

15

我稍微尝试了一下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/template文档中没有找到或理解如何实现这一点。 我想象中的语法大致类似于这样:

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}}

1
阅读此内容:http://jan.newmarch.name/go/template/chapter-template.html - 具体而言,将其分配给一个变量,您可以从范围循环中调用该变量。 - elithrar
这个主题似乎相当完整,我很快就会仔细阅读所有内容。谢谢。 - Nicolas Marshall
实际上,它甚至提供了我猜测以后可能会遇到的问题的答案。感谢这个好链接。 - Nicolas Marshall
@elithrar,您能添加一个有效的URL吗? - ROMANIA_engineer
2个回答

43

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接