Продолжайте, только если []struct не пуста
У меня есть структура [], которая может не иметь содержимого, но также возможно, что она имеет содержимое:
Anleitung []struct {
Name string `json:"blog"`
Link string `json:"link"`
} `json:"anleitung"`
В моем шаблоне я пытаюсь проверить, содержит ли Anleitung что-то, и только затем продолжаю:
{{ ne $jb.Anleitung "" }}
<div class="btn-group">
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="badge">4</span> Anleitungen <span class="caret"></span>
</button>
<ul class="dropdown-menu">
{{ range $anl := $jb.Anleitung }}
<li><a href="{{ $anl.Link }}?ref=jbguide">{{ $anl.Name }}</a></li>
{{ end }}
</ul>
</div>
{{ end }}
Компиляция всего этого дает мне следующую ошибку:
Ошибка рендеринга
index
template: template: index.tmpl:131: неожиданный {{end}}
Строка № 131 является последней строкой в файле шаблона.
Есть ли способ проверить, содержит ли структура [] какие-либо данные?
2 ответа
Вы можете просто использовать {{with}}
действие. Цитирование из пакета документов text/template
:
{{with pipeline}} T1 {{end}}
If the value of the pipeline is empty, no output is generated;
otherwise, dot is set to the value of the pipeline and T1 is
executed.
поскольку {{with}}
также устанавливает конвейер, измените ваш {{range}}
к этому:
{{ range $anl := . }}
Используй это:
{{ with $jb.Anleitung }}
<div class="btn-group">
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="badge">4</span> Anleitungen <span class="caret"></span>
</button>
<ul class="dropdown-menu">
{{ range $anl := . }}
<li><a href="{{ $anl.Link }}?ref=jbguide">{{ $anl.Name }}</a></li>
{{ end }}
</ul>
</div>
{{ end }}
Идя дальше, вы можете упростить {{range}}
как нам не нужно $anl
переменная, {{range}}
также устанавливает конвейер:
{{ range . }}
<li><a href="{{.Link}}?ref=jbguide">{{.Name}}</a></li>
{{ end }}
Тестирование это:
t := template.Must(template.New("").Parse(templ))
m := map[string]interface{}{}
fmt.Println("First, no params:")
if err := t.Execute(os.Stdout, m); err != nil {
fmt.Println(err)
}
fmt.Println("Next, 2 values:")
m = map[string]interface{}{
"Anleitung": []struct {
Name string `json:"blog"`
Link string `json:"link"`
}{
{"Bob", "http://google.com"},
{"Alice", "http://amazon.com"},
},
}
if err := t.Execute(os.Stdout, m); err != nil {
fmt.Println(err)
}
Вывод (попробуйте на Go Playground):
First, no params:
Next, 2 values:
<div class="btn-group">
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="badge">4</span> Anleitungen <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="http://google.com?ref=jbguide">Bob</a></li>
<li><a href="http://amazon.com?ref=jbguide">Alice</a></li>
</ul>
</div>
Две вещи:
- Ваш
ne
синтаксис неверен. Нужно начинать сif
тогда ваш{{ end }}
больше не будет синтаксической ошибкой. - Ваша структура никогда не будет равна
""
потому что это не строка. Если вы хотите узнать, пустой ли срез, вы должны проверить его длину. Как это описано в документе, способ сделать это с помощьюpipeline
, Это, по сути, сделает № 1 устаревшим.