required 对 string 仅判零值,不处理空白;需组合 min=1 实现非空校验;嵌套结构体字段必须导出(首字母大写)才生效;标签逗号不可有空格;跨字段比较须用导出字段名且大小写严格匹配。

字符串字段的 required 不等于非空字符串
validator 的 required 对 string 类型只判断是否为零值(即 ""),不处理空白字符。用户提交 " "、"\t" 或全角空格 " ",校验仍会通过。
这不是 bug,是设计行为。解决办法不是弃用 required,而是组合 min=1:
-
validate:"required,min=1":等价于strings.TrimSpace(s) != "",能过滤纯空白 - 若需更严格(如禁止首尾空格),必须自定义函数,
required,min=1是最简有效兜底 -
min=1对非字符串类型(如 slice)表示元素个数 ≥ 1,语义不同,勿混用
嵌套结构体里字符串字段校验失效?先看字段是否导出
validator 依赖反射读取字段,只能访问首字母大写的导出字段。小写字段哪怕打满 validate:"required,email" 标签,也会被静默忽略——不报错、不校验、无提示。
常见错误写法:type User { email string `validate:"required"` } → email 完全不参与校验。
立即学习“go语言免费学习笔记(深入)”;
正确写法:type User { Email string `json:"email" validate:"required,email"` }。注意:json:"email" 只影响序列化,和字段是否导出无关;Email 才是关键。
嵌套结构体同理:Child 内部的 Name 也必须大写,否则 Child.Name 的标签不会生效。
字符串长度/格式校验要小心逗号空格和类型匹配
validate 标签语法极其脆弱:规则间必须用英文逗号 , 分隔,且**逗号前后绝对不能有空格**。多一个空格,对应规则就被静默跳过。
- 合法:
validate:"required,min=3,max=20" - 非法:
validate:"required, min=3"→min=3被忽略 - 非法:
validate:"required ,max=20"→ 同样失效 -
email、url、datetime=2006-01-02等规则,只对string类型生效;若字段是*string,需额外确保指针非 nil,否则email规则不触发
跨字段比较(如 eqfield)必须用 Go 字段名,不是 JSON key
eqfield、gtfield 等规则比较的是同一结构体内 **Go 字段名**,大小写敏感,且该字段必须导出(首字母大写)。
- 正确:
ConfirmPassword string `validate:"eqfield=Password"`→ 比较Password字段值 - 错误:
confirm_password string `validate:"eqfield=Password"`→ 小写字段无法被反射读取,eqfield查不到目标,静默失效 - 错误:
Password string `json:"password"`和ConfirmPassword string `json:"confirm_password"`→jsontag 不影响字段名解析,eqfield仍认Password
最容易被忽略的是:字段名拼错、大小写不一致、或目标字段未导出——这三类问题都导致 eqfield 完全不生效,且没有任何提示。


















