validator 应全局初始化一次,避免重复创建浪费内存;结构体字段需首字母大写并同时含 json 和 validate 标签;指针字段 required 仅判 nil;validate 标签逗号分隔无空格,用 | 表示“或”,omitempty 必须置最左,切片/map 元素校验需显式加 dive。

validator 初始化必须在全局做一次
别每次 handler 里 new 一个 validator.New()——它内部有缓存和反射元信息,重复初始化浪费内存、拖慢首次校验。正确做法是定义全局变量,在 main() 或包初始化时完成实例化。
- 初始化后可选注册自定义规则(如手机号、身份证),但非必需
- 若用 Gin,默认不启用
validate标签,需手动配置:调用gin.SetMode(gin.ReleaseMode)后,c.ShouldBindJSON才会识别validatetag(否则只认binding) - 不用 Gin?直接用
v := validator.New()实例调用v.Struct()即可,完全框架无关
结构体字段必须首字母大写且带 json 标签
validator 只能读取导出字段(首字母大写),且依赖 json 标签做字段映射;validate 标签单独存在无效,必须和 json(或 form)共存。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
- 错误写法:
Name string `validate:"required"`→validator能读到标签,但 Gin 绑定时找不到对应 JSON 字段,绑定为空,校验形同虚设 - 正确写法:
Name string `json:"name" validate:"required,min=2"` - 指针字段(如
*string)要小心:required只判是否为nil,不判解引用后是否为空字符串
validate 标签里不能有空格,逗号分隔但不支持 or/and 逻辑
写成 validate:"required, min=2"(带空格)会导致 min=2 被整个忽略;validator 不解析 and 或 or,靠逗号顺序或竖线 | 表达“或”关系。
-
required,email:先检查非零值,再检查邮箱格式 -
email|url:满足 email 或 url 任一即可(注意是竖线|,不是英文逗号) -
-表示跳过该字段校验,不是“可选”,也不是 “omitempty” 的替代品 -
omitempty必须放在规则链最左:validate:"omitempty,min=1"—— 若字段为零值,则整条规则跳过;写成validate:"min=1,omitempty"无效
嵌套结构体 vs 切片元素的 dive 规则容易混淆
结构体字段内嵌另一个结构体,validator 默认递归校验,不用加 dive;但切片、数组、map 里的每个元素必须显式加 dive,否则只校验容器本身(比如切片长度),不进元素内部。
- 嵌套结构体:
User User `json:"user" validate:"required"`→ 自动校验User内字段 - 切片元素:
Items []Item `json:"items" validate:"dive,required"`→ 每个Item都触发required - map 值校验:
Data map[string]string `json:"data" validate:"dive,keys,ascii,endkeys,min=1"`→ 键需 ASCII,值至少 1 字符 - 忘记
dive是静默失效:没报错,但子项完全不校验,极难排查
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










