
在 Go 的 text/template 中,可通过 {{range}}...{{else}}...{{end}} 语法优雅处理空数据场景:当管道值(如切片、映射)长度为零时执行 {{else}} 分支,否则遍历渲染。
在 go 的 `text/template` 中,可通过 `{{range}}...{{else}}...{{end}}` 语法优雅处理空数据场景:当管道值(如切片、映射)长度为零时执行 `{{else}}` 分支,否则遍历渲染。
Go 模板的 range 动作原生支持条件分支,无需额外函数或辅助逻辑即可实现“有数据则渲染列表,无数据则显示提示”的常见需求。
基本语法结构如下:
{{range .Users}}
<div class="user">{{.Name}}</div>
{{else}}
<p class="empty-state">暂无用户</p>
{{end}}
✅ 适用数据类型:range 后的 pipeline 必须是数组、切片、map 或 channel;其“空”由 len() 判断(例如空切片 []User{}、nil 切片、空 map map[string]int{} 均触发 else 分支)。
⚠️ 注意点:
- {{else}} 是 {{range}} 的内置分支,不可与 {{if}} 混用(如 {{if .Users}}{{range .Users}}...{{end}}{{else}}...{{end}} 是冗余且易出错的写法);
- {{else}} 分支中 . 仍指向原始上下文(即未被 range 修改),可安全访问 .Title、.Message 等顶层字段;
- 若需在 else 中判断具体原因(如网络错误 vs 数据为空),应提前在 Go 代码中设置状态字段(如 .HasUsers 或 .Error),而非依赖模板逻辑。
推荐实践示例:
<!-- 渲染用户列表,支持空状态与错误提示 -->
{{range .Users}}
<article><h3>{{.Name}}</h3>
<p>{{.Email}}</p>
</article>
{{else}}
{{if .Error}}
<div class="alert alert-error">加载失败:{{.Error}}</div>
{{else}}
<div class="alert alert-info">当前暂无用户数据</div>
{{end}}
{{end}}
该方案简洁、高效、符合 Go 模板设计哲学——将控制逻辑交由动作(Action)完成,保持模板语义清晰、易于维护。











