gin模板中直接用{{if .list}}即可判断slice是否为空,因空slice、nil slice和空map在{{if}}中均视为false;无需且不可用len函数,若需区分nil与空切片须在handler中显式传入标志位。

模板里用 {{if .List}} 判断是否为空就行
Gin 默认用 Go 的 html/template,它对 slice、map、channel 等类型的“空值”有明确判定规则:空 slice([]string{})、nil slice、空 map(map[string]string{})都会被 {{if}} 当作 false。所以最简写法就是直接判断变量本身。
-
{{if .Users}}能同时覆盖nil和[]User{}两种情况 - 别写
{{if len .Users}}——len函数在模板里不可用,会报function "len" not defined - 也别写
{{if eq (len .Users) 0}},同样因为len不可用
想区分 nil 和空切片?得在后端预处理
模板层无法区分 nil []User 和 []User{},两者在 {{if}} 中表现一致。如果业务上必须区分(比如“未加载” vs “加载了但没数据”),就得在 handler 里显式传入标志位:
c.HTML(200, "list.html", gin.H{
"Users": users,
"HasUsers": users != nil, // 显式暴露 nil 状态
})
- 模板中用
{{if .HasUsers}}判断是否为 nil - 再用
{{if .Users}}判断是否有元素(此时已知不为 nil,可安全遍历) - 不推荐在模板里硬塞逻辑做反射或类型判断,既难读又易错
遍历时顺便处理空状态,更实用
多数场景下,你真正需要的不是“判断空”,而是“空时显示提示,非空时渲染列表”。直接用 {{range}} 的 {{else}} 分支更干净:
{{range .Users}}
<div>{{.Name}}</div>
{{else}}
<div class="empty">暂无用户</div>
{{end}}
-
{{range}}在值为 nil 或空时自动进入{{else}}分支 - 比嵌套
{{if}}{{range}}{{else}}{{end}}更简洁,语义也更清晰 - 注意:不要在
{{range}}外再套一层{{if}},纯属冗余
容易忽略的坑:结构体字段没导出
如果传入的是自定义结构体,且其 slice 字段是小写开头(如 users []User),模板里将读不到该字段,{{if .Users}} 永远为 false —— 因为 Go 模板只能访问首字母大写的导出字段。
- 检查结构体定义:
Users []User✅,users []User❌ - 用
gin.H传 map 是安全的,因为 map 的 key 是字符串,不受导出限制 - 调试时可在模板里加
{{printf "%#v" .}}查看实际传入的数据结构











