在 golang 模板中迭代 Map/Dictionary

sti*_*ihl 2 templates dictionary go web

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

type indexPageStruct struct {
BlogPosts   []post
ArchiveList map[string]int
}
Run Code Online (Sandbox Code Playgroud)

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

{{range .BlogPosts}}
                <article>
                    <h2><a href="/">{{.Title}}</a></h2>
...
Run Code Online (Sandbox Code Playgroud)

但我似乎无法弄清楚如何做这样的事情:

{{range .ArchiveList}}
                <article>
                    <h2><a href="/">{{.Key}}  {{.Value}}</a></h2>
....
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 7

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

引用自包文档text/template

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

range $index, $element := pipeline
Run Code Online (Sandbox Code Playgroud)

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

中的所有内容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)
}
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

Key: one, Value: 1
Key: two, Value: 2
Run Code Online (Sandbox Code Playgroud)