嵌套结构体字段校验需满足三条件:字段首字母大写导出、上层字段加dive标签、指针类型需配合omitempty或required;小写字母字段被静默忽略,tag逗号前后不能有空格。

嵌套结构体字段不校验?先看是否导出
validator 对小写字母开头的字段完全静默跳过,不报错也不校验。比如 Name 可以校验,name 就会被忽略——哪怕 tag 写得再对也没用。
常见错误写法:type User struct { name string `validate:"required"` },运行 Validate.Struct() 返回 nil,但其实什么都没做。
- 所有需校验字段必须首字母大写,如
Name、Email、Address - 嵌套结构体(如
Address)内部字段也必须导出,否则Address.Street不会触发nonzero等规则 - 用
reflect.TypeOf(u).NumField()打印字段数,确认是否只有 0 个——那是全小写导致的
嵌套结构体校验失效?检查 dive 和指针语义
validator 默认对非 nil 的嵌套结构体递归校验,但对 *Address 类型字段,若值为 nil,则整个子结构被跳过;而 Address(非指针)即使全零值也会进入校验。
想让空对象跳过子校验,必须组合使用:Address *Address `validate:"omitempty"`。注意 omitempty 仅对指针、map、slice 等类型生效,对普通 struct 字段无效。
- 嵌套字段是值类型(
Address Address):即使Street=="",仍会校验其nonzero规则 - 嵌套字段是指针(
Address *Address):值为nil时跳过;若想强制校验,加required,dive -
dive是关键:它告诉 validator 进入下一层,没有它,*Address或[]User的内部字段标签全被忽略
语言学习数据中常见嵌套结构怎么写 tag?
像用户提交的「学习记录」可能含多层嵌套:用户信息 → 课程列表 → 每节课的练习记录 → 每条记录的文本/音频/时间戳。这类结构容易因 tag 写法或类型选择导致校验断裂。
示例结构:
type LearningRecord struct {
UserID int `validate:"required,gte=1"`
Courses []Course `validate:"dive"` // 必须加 dive,否则 Courses[0].Title 不校验
Meta map[string]string `validate:"dive,keys,alphanum,endkeys"`
}
type Course struct {
Title string `validate:"required,min=2"`
Exercises []Exercise `validate:"dive"`
}
type Exercise struct {
Text string `validate:"required,ne=""` // 注意:required 不过滤空格,需提前 trim
At string `validate:"datetime=2006-01-02T15:04:05Z"` // time.Time 不能直接用 datetime 标签
}
-
required对" "、"\u200b"无效,绑定前务必调用strings.TrimSpace() -
datetime只作用于string类型,time.Time字段加该 tag 完全无效果 - map 的 key 需用
keys/endkeys包裹,否则只校验 value
tag 语法出错却不报错?逗号前后不能有空格
validator 的 tag 解析极其严格:任意一个逗号前后出现空格,对应规则就被静默丢弃。比如 validate:"required, min=3" 中的 min=3 不生效,且无任何提示。
- 合法写法:
validate:"required,min=3,max=20,email" - 非法写法:
validate:"required, min=3"(逗号后空格)、validate:"required ,max=20"(逗号前空格) - 多个规则间只能用英文逗号分隔,不能混用中文逗号或全角符号
- 建议用 IDE 的字符串高亮或写个简单测试函数,把 tag 贴进去跑
Validate.Var("", "required,min=1")快速验证语法
最易被忽略的是:嵌套字段的 tag 生效依赖上层字段类型 + 是否加 dive + 字段是否导出,三者缺一不可。调试时别只盯单个 tag,要顺着引用链逐层确认。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











