
在 Go 模板中,需使用 {{with}} 动作判断结构体切片是否非空;若为空则跳过整个区块,避免无效渲染和语法错误。{{with}} 会自动将上下文设为切片本身,配合 {{range .}} 即可简洁、安全地遍历。
在 go 模板中,需使用 `{{with}}` 动作判断结构体切片是否非空;若为空则跳过整个区块,避免无效渲染和语法错误。`{{with}}` 会自动将上下文设为切片本身,配合 `{{range .}}` 即可简洁、安全地遍历。
Go 模板不支持直接对切片使用字符串比较(如 {{ ne $jb.Anleitung "" }}),因为切片类型无法与空字符串比较,这会导致编译错误(如 unexpected {{end}}),本质是模板语法解析失败——前置条件判断语句未正确闭合。
✅ 正确做法是使用 {{with pipeline}}:它专为“存在性检查 + 上下文切换”设计。当 $jb.Anleitung 为 nil 或长度为 0 的切片时,{{with}} 内容完全不渲染;反之,则将 .(当前上下文)设为该切片,后续 {{range .}} 可直接遍历元素,无需额外变量绑定。
以下是推荐的模板写法:
{{ 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 . }}
<li><a href="%7B%7B%20.Link%20%7D%7D?ref=jbguide">{{ .Name }}</a></li>
{{ end }}
</ul>
</div>
{{ end }}
? 关键说明:
-
{{ with $jb.Anleitung }}自动处理nil和空切片(len == 0)两种情况,二者均视为“空值”; -
{{ range . }}中的.即当前切片中的每个结构体元素,可直接访问.Name和.Link,语义清晰且无冗余变量; - 不要混用
$anl := .和{{range}}——{{range}}本身已重置.,显式命名仅在需要保留外层上下文(如嵌套循环)时才有意义; - 若需在
{{with}}块内访问原始数据(如$jb.Title),可用$引用最外层数据对象。
⚠️ 注意事项:
- 避免使用
{{ if len $jb.Anleitung }}:Go 模板中len函数不可用于 pipeline(除非自定义函数),且语法不支持; - 不要尝试
{{ if $jb.Anleitung }}:虽能检测nil,但无法识别非-nil空切片(如[]struct{}{}),存在逻辑漏洞; - 所有
{{with}}、{{if}}、{{range}}等动作必须严格配对{{end}},缩进不影响解析,但缺失或错位会导致unexpected {{end}}类错误。
此方案兼顾安全性、可读性与 Go 模板最佳实践,是处理可选切片数据的标准范式。










