Продолжайте, только если []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>

Две вещи:

  1. Ваш ne синтаксис неверен. Нужно начинать с ifтогда ваш {{ end }} больше не будет синтаксической ошибкой.
  2. Ваша структура никогда не будет равна ""потому что это не строка. Если вы хотите узнать, пустой ли срез, вы должны проверить его длину. Как это описано в документе, способ сделать это с помощью pipeline, Это, по сути, сделает № 1 устаревшим.
Другие вопросы по тегам