我有一个[]结构,它可以没有内容,但也可能有内容:
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
模板时出错:模板:index.tmpl:131:意外{{end}}
第131行是模板文件中的最后一行。
有没有办法检查[]结构是否包含任何数据?
答案 0 :(得分: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 :(得分:1)
两件事:
ne
语法错误。它需要以if
开头,然后您的{{ end }}
将不再是语法错误。""
,因为它不是一个字符串。如果您想知道切片是否为空,则必须检查其长度。在模板中执行此操作的方法是as documented,pipeline
。实际上,这将使#1过时。