dongshang6790 2017-12-06 18:26
浏览 30
已采纳

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

I have a vector with n elements. I'm using it to render items in a template. But I need to render only the 5 first elements. Please note that is possible to have less than 5 elements in vector, in this case will render all elements. Is there is a way to do it in template?

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

1条回答 默认 最新

  • dongwu9063 2017-12-06 18:43
    关注

    Easiest would be to only pass 5 elements, so you don't need any logic in the template.

    You can also do this in template, if you also store the index in the {{range}} action. Then you can use an {{if}} action to check the index, and only render the body of the {{if}} if the index is less than 5:

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

    Here's a simple example demonstrating it:

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

    Output (try it on the Go Playground):

    0 1 2 3 4 
    

    Go 1.10 template extension

    Note that in Go 1.10 there will be new {{break}} and {{continue}} actions which will provide an alternative, better solution for this.

    It will look something like this:

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

    This new {{break}} action will provide a superior solution as the above {{range}} action will only iterate over 5 elements at most (while the other solution without {{break}} has to iterate over all elements, just elements with index >= 5 are not rendered).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 poi合并多个word成一个新word,原word中横版没了.
  • ¥15 【火车头采集器】搜狐娱乐这种列表页网址,怎么采集?
  • ¥15 求MCSCANX 帮助
  • ¥15 机器学习训练相关模型
  • ¥15 Todesk 远程写代码 anaconda jupyter python3
  • ¥15 我的R语言提示去除连锁不平衡时clump_data报错,图片以下所示,卡了好几天了,苦恼不知道如何解决,有人帮我看看怎么解决吗?
  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?