在golang模板中迭代Map / Dictionary

时间:2016-09-19 20:18:44

标签: templates dictionary web go

我是Go的初学者,正在教自己一些网络开发。我试图在模板文件中循环遍历地图,但无法找到有关如何执行此操作的任何文档。这是我传入的结构:

type indexPageStruct struct {
BlogPosts   []post
ArchiveList map[string]int
}

我可以使用以下方法循环使用BlogPosts:

{{range .BlogPosts}}
                <article>
                    <h2><a href="/">{{.Title}}</a></h2>
...

但我似乎无法弄清楚如何做以下事情:

{{range .ArchiveList}}
                <article>
                    <h2><a href="/">{{.Key}}  {{.Value}}</a></h2>
....

1 个答案:

答案 0 :(得分:1)

您可以在模板中“覆盖”地图,就像您可以在Go中对地图值进行“范围循环”一样。您还可以在迭代期间将映射键和值分配给临时变量。

引自text/template的包文档:

  

如果“range”操作初始化变量,则将变量设置为迭代的连续元素。另外,“范围”可以声明两个变量,用逗号分隔:

range $index, $element := pipeline
     

在这种情况下,$ index和$ element分别设置为数组/切片索引或map键和元素的连续值。

text/template中的所有内容也适用于html/template

请参阅此工作示例:

templ := `{{range $k, $v := .ArchiveList}}Key: {{$k}}, Value: {{$v}}
{{end}}`
t := template.Must(template.New("").Parse(templ))
p := indexPageStruct{
    ArchiveList: map[string]int{"one": 1, "two": 2},
}
if err := t.Execute(os.Stdout, p); err != nil {
    panic(err)
}

输出(在Go Playground上尝试):

Key: one, Value: 1
Key: two, Value: 2