Например:
{{range .Users}}
{{if .IsAdmin}}
{{/* How to use "break" or "continue"? */}}
{{end}}
{{end}}
Документация для «перерыва» или «продолжения» в шаблонах недоступна на golang.org.
Например:
{{range .Users}}
{{if .IsAdmin}}
{{/* How to use "break" or "continue"? */}}
{{end}}
{{end}}
Документация для «перерыва» или «продолжения» в шаблонах недоступна на golang.org.
Они не задокументированы, потому что их не существует.
Чтобы убедиться — проверьте тесты для лексера text/template
: https://github.com/golang/go/blob/master/src/text/template/parse/lex_test.go
break
, и вам не нужно continue
, пока у вас есть {{if
. Шаблоны Golang не подходят для слишком сложной логики.
- person zerkms; 19.04.2017
{{if .IsAdmin}}
. То, что находится внутри {{if }}
, будет отображаться только в том случае, если условие истинно.
- person zerkms; 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 следовать коду.
Вы можете использовать переменную, чтобы добавить проверку в процессе обработки и пропустить любые существующие проверки до конца цикла.
// 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 }}
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 г.)