Как использовать ключевые слова continue и break в шаблонах golang?

Например:

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

Документация для «перерыва» или «продолжения» в шаблонах недоступна на golang.org.


person emurmotol    schedule 19.04.2017    source источник


Ответы (4)


Они не задокументированы, потому что их не существует.

Чтобы убедиться — проверьте тесты для лексера text/template: https://github.com/golang/go/blob/master/src/text/template/parse/lex_test.go

person zerkms    schedule 19.04.2017
comment
Но как я могу это сделать? Есть ли другой способ? - person emurmotol; 19.04.2017
comment
Вы не можете имитировать break, и вам не нужно continue, пока у вас есть {{if. Шаблоны Golang не подходят для слишком сложной логики. - person zerkms; 19.04.2017
comment
Можете ли вы поделиться примером того, как я могу пропустить или остановить итерацию? - person emurmotol; 19.04.2017
comment
Вы не можете остановить итерацию. Но вы можете пропустить с помощью простого {{if .IsAdmin}}. То, что находится внутри {{if }}, будет отображаться только в том случае, если условие истинно. - person zerkms; 19.04.2017
comment
Хорошо, я понимаю. Спасибо. - person emurmotol; 19.04.2017

Операторы break и continue являются частью операторов text/template и html/template в Go 1.10 (в бета-версии на момент написания). Из примечаний к выпуску:

Новые действия {{break}} и {{continue}} выходят из самого внутреннего цикла {{range ...}}, как и соответствующие операторы Go.

Предыдущие версии Go (до 1.10) не поддерживают операторы break или continue.

Глядя на бета-документацию, вы можете увидеть новые элементы itemContinue и itemBreak в lexer, новые узлы, такие как ContinueNode, в Parser следовать коду.

person Kyle Brandt    schedule 14.12.2017
comment
Новые действия break и continue не работают в html/template, и их исправление требует размышлений о проблемах безопасности, которые кажутся слишком сложными на данном этапе релиза. Мы попробуем еще раз для 1.11. github.com/golang/go/commit/ - person wener; 26.03.2018

Вы можете использовать переменную, чтобы добавить проверку в процессе обработки и пропустить любые существующие проверки до конца цикла.

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


person verdverm    schedule 26.03.2020

Go101 упоминает (май 2021 г., более 4 лет спустя):

Начиная с Go 1.18, прерывание и продолжение могут поддерживаться в циклах диапазонов шаблонов Go.

Примечание. Go 1.18 должен быть выпущен в первом квартале 2022 года.

Это решит проблему 20531 text/template: добавьте поддержку break и continue.
И в настоящее время реализовано в CL 321491: html/template, text/template: реализовать break и continue для range петель.

На данный момент это все еще продолжается (1 квартал 2021 г.)

person VonC    schedule 22.05.2021