仅迭代Go模板中数组的前n项

时间:2017-12-06 18:26:38

标签: for-loop go slice go-templates

我有一个带n元素的向量。我正在使用它来渲染模板中的项目。但我需要只渲染5个第一个元素。请注意,矢量中的元素少于5个,在这种情况下将呈现所有元素。有没有办法在模板中做到这一点?

{{range .Categorias}}
    <li class="nav-item">
        {{.Nome}}
    </li>
{{end}}

1 个答案:

答案 0 :(得分:4)

最简单的方法是只传递5个元素,因此模板中不需要任何逻辑。

如果您还将索引存储在{{range}}操作中,也可以在模板中执行此操作。然后,您可以使用{{if}}操作来检查索引,并且只有在索引小于5时才呈现{{if}}的正文:

{{range $i, $e := .Categorias}}{{if lt $i 5}}
    <li class="nav-item">
        {{.Nome}}
    </li>
{{end}}{{end}}

以下是一个展示它的简单示例:

func main() {
    t := template.Must(template.New("").Parse(src))
    numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
    if err := t.Execute(os.Stdout, numbers); err != nil {
        panic(err)
    }
}

const src = `{{range $i, $e := .}}{{if lt $i 5}}{{.}} {{end}}{{end}}`

输出(在Go Playground上尝试):

0 1 2 3 4 

转到1.10模板扩展名

请注意,在Go 1.10中会有新的{{break}}{{continue}}操作,这将为此提供另一种更好的解决方案。

看起来像这样:

{{range $i, $e := .Categorias}}
    <li class="nav-item">
        {{.Nome}}
    </li>
{{if eq $i 4}}{{break}}{{end}}{{end}}

这个新的{{break}}操作将提供更好的解决方案,因为上述{{range}}操作最多只迭代5个元素(而没有{{break}}的其他解决方案必须迭代所有元素,只是索引&gt; = 5的元素不会被渲染。