如何在golang模板中使用continue和break关键字?

时间:2017-04-19 02:29:37

标签: go

例如:

{{range .Users}}
    {{if .IsAdmin}}
        {{/* How to use "break" or "continue"? */}}
    {{end}}
{{end}}

golang.org

中未提供模板中“中断”或“继续”的文档

5 个答案:

答案 0 :(得分:3)

breakcontinue语句是Go 1.10中text/templatehtml/template的一部分(在撰写本文时为Beta版)。来自release notes

  

新动作{{break}}{{continue}}突破了最内层   {{range ...}}循环,与相应的Go语句一样。

Go的早期版本(在1.10之前)执行 支持breakcontinue语句。

查看测试版文档,您可以看到lexer中的新itemContinueitemBreak项目,Parser中的ContinueNode之类的新节点代码。

答案 1 :(得分:2)

它们没有记录,因为它们不存在。

要确保 - 请检查text/template词法分析器的测试:https://github.com/golang/go/blob/master/src/text/template/parse/lex_test.go

答案 2 :(得分:0)

这些功能是作为Beta功能短暂添加的,但此后已回滚。我刚刚用go1.12.5进行了测试,但它们仍然不可用。

这是github问题:https://github.com/golang/go/issues/20531

这是回滚:https://go-review.googlesource.com/c/go/+/92155/

答案 3 :(得分:0)

您可以使用变量添加处理中检查,并在循环的其余部分跳过任何现有检查。

// method 1
{{ $dothing := false }}
{{ range $i, $A := .List }}
  {{ if $A.Check }}
    {{ $dothing = true }}
  {{end}}
{{ end }}
{{ if $dothing }}
  // do thing
{{ end }}

// method 2
{{ $already := false }}
{{ range $i, $A := .List }}
  {{ if $already }}
  {{ else }}
    {{ if $A.Check }}
      {{ $already = true }}
      // do thing
    {{ end }}
  {{ end }}
{{ end }}


答案 4 :(得分:0)

enter image description here(2021 年 5 月,4 年后):

<块引用>

从 Go 1.18 开始,Go 模板的范围循环可能支持“break”和“continue”。

注意:Go101 does mention 应于 2022 年第一季度发布。

这将解决 Go 1.18 文本/模板:添加 breakcontinue 支持。
并且目前在 issue 20531: html/template, text/template: 实现 breakcontinue for range 循环中实现。

目前这项工作仍在进行中(2021 年第一季度)