【问题标题】:Iterate over only the first n items of an array in a Go template仅迭代 Go 模板中数组的前 n 项
【发布时间】:2018-05-20 17:38:46
【问题描述】:

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

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

【问题讨论】:

    标签: for-loop go slice go-templates


    【解决方案1】:

    最简单的方法是只传递 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 
    

    Go 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}} 的其他解决方案必须迭代所有元素,只有具有索引的元素> = 5 未渲染)。

    Go 1.13 模板扩展

    Go 1.13 adds the slice builtin template function 提供了一个更好、更高效的解决方案。切片您想要覆盖的值,因此 {{range}} 操作仅“获取”您想要循环的内容:

    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 := (slice . 0 5)}}{{.}} {{end}}`
    

    这将输出(在Go Playground 上尝试):

    0 1 2 3 4
    

    【讨论】:

    • 嗨@icza 感谢您的回答,它工作得很好。
    • breakcontinuerange?很快...(如果一切顺利,2022 年第一季度):stackoverflow.com/a/67653735/6309
    • @VonC 感谢您的注意,一旦到达,将其添加到答案中:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2015-09-22
    相关资源
    最近更新 更多