必须写binding标签才能触发校验,如binding:"required";不写则完全跳过校验,gin仅识别binding内规则,忽略json、form或validate等其他标签。

binding 标签里写什么才能触发校验
不写 binding 标签,字段就完全不参与校验,哪怕结构体字段名和 JSON key 一致也没用。Gin 只认 binding 里的规则,不是 json 或 form 标签。
常见错误是把校验逻辑塞进 validate 标签(比如 validate:"required"),Gin 完全忽略它;或者只写 json:"user_name" 却漏掉 binding:"required",结果零校验。
-
binding:"required"是最简必要项,缺它等于没校验 - 多个规则用英文逗号分隔,如
binding:"required,email,max=50",顺序无关 -
omitempty不影响校验——它只控制序列化时是否省略字段,required仍会判空字符串或零值为失败
ShouldBind 和 ShouldBindJSON 的区别在哪
本质是解析源和匹配逻辑不同:ShouldBind 看 Content-Type 自动选解析方式(JSON / form / query),ShouldBindJSON 强制只从请求体读 JSON 并解析。
用错就会直接报错:比如前端发的是 application/x-www-form-urlencoded 表单,你却调 c.ShouldBindJSON(&req),会卡在 JSON 解析阶段,报 invalid character 类错误,根本进不到校验环节。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
- GET 请求参数走查询字符串,必须用
c.ShouldBindQuery(&req),且结构体字段要带form标签(如form:"page") - POST 表单(
multipart/form-data)中文件字段类型必须是*multipart.FileHeader,且必须有form标签,否则绑定为空 - 字段名匹配优先级:有
json标签 → 按 JSON key 匹配;无json但有form→ 按表单名匹配;都无 → fallback 到结构体字段名(大小写敏感,不推荐)
怎么拿到具体哪个字段、哪条规则失败了
err.Error() 返回的是合并后的字符串,没法提取字段名或错误码。必须断言为 validator.ValidationErrors 才能结构化处理。
别直接用 fe.StructField() —— 它返回 Go 字段名(如 UserName),而前端通常按 JSON key(如 user_name)消费数据。要用 fe.Field(),它返回的是标签里定义的键名。
- 用
errors.As(err, &ve)尝试转成*validator.InvalidValidationError,再从ve.Err提取validator.ValidationErrors - 遍历每个
fe,调fe.Field()得 JSON key,fe.Tag()得失败规则(如"required"),fe.Value()得实际传入值 - 自定义错误映射表建议用
fe.Field() + "." + fe.Tag()作 key,比如"email.required"→"邮箱不能为空"
为什么自定义校验器注册后不生效
注册只是把函数挂到 validator 实例上,真正起作用靠的是结构体字段的 binding 标签里写了对应 tag 名。比如注册了 v.RegisterValidation("mobile", fn),结构体里就得写 binding:"mobile",写成 binding:"phone" 就调不到。
另一个常见坑:嵌套结构体里用 eqfield 这类跨字段规则时,eqfield=Password 默认只在**当前 struct 层级**找 Password 字段,不会向上穿透到父级。比如 User.Profile.Password 和 User.Password 不同层,eqfield 就失效。
- 注册必须在路由注册前完成,且要确保
binding.Validator.Engine()返回的是*validator.Validate类型 - 字段级校验器(
RegisterValidation)和结构体级校验器(RegisterStructValidation)是两套机制,别混用 - 如果用了自定义
StructValidator替换engine.Validator,记得在ValidateStruct里手动调原 validator 做基础校验,再追加业务逻辑,否则内置规则(如required)就丢了
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










