为什么在微信里面打了一堆空格键盘上的 “发送” 变成了 “换行”右边也没有独立发送按钮想点发送发现按钮是灰的或者直接消失了为什么你打了空格发送按钮直接没了这就是微信前端输入校验的典型表现当你输入框里只有空格或其他不可见空白字符时微信会判定为「无有效内容」直接隐藏发送按钮根本不让你提交Go 语言输入校验Validation详解在实际开发中用户提交的数据是不可信的。例如{username:admin,password:123}如果后端不校验用户名为空密码长度不足邮箱格式错误年龄为负数都会直接进入数据库因此输入校验Validation是后端开发必须要做的事情一、什么是输入校验例如注册接口{username:zhangsan,password:123456,email:123qq.com}后端需要检查username 是否为空 password 长度是否符合要求 email 格式是否正确 年龄是否超出范围这个过程就叫输入校验 (Input Validation)二、Gin中的输入校验Gin已经帮我们集成好了github.com/go-playground/validator/v10所以c.ShouldBindJSON()不仅能绑定数据{username:admin}还能自动校验三、最简单的例子定义结构体typeRegisterReqstruct{Usernamestringjson:username binding:requiredPasswordstringjson:password binding:required}接口funcRegister(c*gin.Context){varreq RegisterReqiferr:c.ShouldBindJSON(req);err!nil{c.JSON(400,gin.H{msg:err.Error(),})return}c.JSON(200,gin.H{msg:success,})}请求{username:admin}少了 password返回{msg:Key: RegisterReq.Password Error:Field validation for Password failed on the required tag}说明required 表示不能为空四、常用校验标签required不能为空typeUserstruct{Namestringjson:name binding:required}min最小长度typeUserstruct{Passwordstringjson:password binding:min6}要求长度至少6位max最大长度typeUserstruct{Usernamestringjson:username binding:max20}要求最多20个字符len固定长度typeUserstruct{Codestringjson:code binding:len6}要求必须6位验证码经常用。五、数字校验gt大于Ageintjson:age binding:gt0要求age 0gte大于等于Ageintjson:age binding:gte18要求age 18lt小于Ageintjson:age binding:lt100要求age 100lte小于等于Ageintjson:age binding:lte100要求age 100六、邮箱校验typeUserstruct{Emailstringjson:email binding:required,email}请求{email:123qq.com}通过请求{email:abc}失败七、手机号校验validator没有内置中国手机号规则。一般自己写typeUserstruct{Phonestringjson:phone binding:required,len11}或者regexp校验。八、多个规则同时使用typeUserstruct{Usernamestringjson:username binding:required,min3,max20}含义不能为空 至少3位 最多20位九、ShouldBindJSON干了什么很多人只会写c.ShouldBindJSON(req)不知道发生了什么实际上第一步读取Body{username:admin,password:123456}第二步根据json:username映射字段变成req.Usernameadmin第三步检查binding:required第四步检查binding:min6第五步全部通过返回errnil最终JSON ↓ 结构体 ↓ binding校验 ↓ 成功十、自定义校验例如用户名必须以 admin 开头Gin默认没有。可以注册自己的规则。validate.RegisterValidation(admin,func(fl validator.FieldLevel)bool{value:fl.Field().String()returnstrings.HasPrefix(value,admin)})使用typeUserstruct{Usernamestringbinding:admin}十一、项目中最常见写法typeLoginReqstruct{Usernamestringjson:username binding:requiredPasswordstringjson:password binding:required,min6,max20}funcLogin(c*gin.Context){varreq LoginReqiferr:c.ShouldBindJSON(req);err!nil{c.JSON(400,gin.H{msg:err.Error(),})return}// 登录逻辑}十二、面试高频问题Q1Gin如何进行参数校验答Gin底层集成了 validator 库。 通过 binding 标签定义校验规则。 调用 ShouldBindJSON 时 先绑定JSON到结构体 再自动执行校验Q2required是什么意思binding:required表示字段不能为空Q3ShouldBindJSON做了什么读取请求Body JSON转结构体 执行binding规则校验 返回error总结ShouldBindJSON JSON解析 结构体赋值 validator校验常见标签required 必填min 最小长度max 最大长度len 固定长度gt 大于gte 大于等于lt 小于lte 小于等于email 邮箱格式实际开发中最常用的组合binding:“required”binding:“required,min6,max20”binding:“required,email”