结构体字段必须首字母大写才能被 validator 读取,小写字段即使有 validate 标签也会被忽略;required 对字符串仅判零值,需搭配 min=1 过滤纯空格;嵌套结构体需指针+omitempty 或避免子字段 required;切片/map 嵌套必须显式加 dive。

结构体字段必须首字母大写才能被 validator 读到
validator 依赖反射访问字段,只能读取导出字段(即首字母大写)。小写字段哪怕打满 validate:"required,email" 标签,也会被完全忽略——不报错、不校验、无提示。
常见错误写法:type User { email string `validate:"required"` } → email 字段不参与任何校验。
正确写法:type User { Email string `json:"email" validate:"required,email"` }。json 标签只影响序列化,和字段是否导出无关;validate 标签生效的前提是字段可被反射读取。
嵌套结构体同理:内层 Child 的字段也必须大写,否则 Child.Name 不会校验。
required + min=1 才能真正过滤纯空格
required 对 string 类型只判断是否为零值(即 ""),但用户提交 " " 或全角空格 " " 时仍会通过。这不是 bug,是设计行为。
典型问题:前端输入框只按了空格就提交,后端却认为“有值”。
解决方案不是弃用 required,而是组合使用:validate:"required,min=1"。
-
min=1实际效果等价于strings.TrimSpace(s) != "",能过滤纯空白 - 若需更严格(如禁止首尾空格),得自定义验证函数;
required+min=1是最简有效兜底
嵌套结构体校验失败?先检查是不是缺了 omitempty 或指针类型
validator 默认对非 nil 的嵌套结构体做深度校验,哪怕它所有字段都是零值(Name: "", Age: 0),子字段的 required 仍会触发。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
现象:父结构体传了 {Child: Child{}},子字段 Child.Name 加了 required,结果校验失败。
原因:Child 是值类型,非 nil 就进校验;而 omitempty 对值类型无效。
解法一(推荐):把字段改为指针类型 + omitempty:Child *Child `validate:"omitempty"`,传 nil 则跳过整个子校验。
解法二:若必须用值类型,且允许空对象,则子字段别加 required,改由业务逻辑判断语义是否为空。
切片/Map 嵌套必须显式加 dive
Users []User `validate:"dive"` 是必须写的,否则 Users[0].Name 的标签不生效。
常见错误:只写 validate:"required" 或 validate:"min=1",漏掉 dive,导致元素内部字段完全不校验。
其他组合场景:
- 切片元素还需非空校验:
validate:"required,dive,required" - Map 值校验:
Data map[string]string `validate:"dive,required"` - 嵌套切片:
Orders [][]Item `validate:"dive,dive"`
不加 dive 的切片字段,validator 只校验切片本身是否为 nil 或长度,不会深入每个元素。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










