// 不能为空,并且不能没有这个字段 required: 必填字段,如:binding:"required" // 针对字符串的长度 min 最小长度,如:binding:"min=5" max 最大长度,如:binding:"max=10" len 长度,如:binding:"len=6" // 针对数字的大小 eq 等于,如:binding:"eq=3" ne 不等于,如:binding:"ne=12" gt 大于,如:binding:"gt=10" gte 大于等于,如:binding:"gte=10" lt 小于,如:binding:"lt=10" lte 小于等于,如:binding:"lte=10" // 针对同级字段的 eqfield 等于其他字段的值,如:PassWord string `binding:"eqfield=Password"` nefield 不等于其他字段的值 - 忽略字段,如:binding:"-"
演示代码
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"reflect"
)
type UserInfo struct {
Username string `json:"username" binding:"required" msg:"用户名不能为空"`
Password string `json:"password" binding:"min=3,max=6" msg:"密码长度不能小于3大于6"`
Email string `json:"email" binding:"email" msg:"邮箱地址格式不正确"`
}
func GetValidMsg(err error, obj any) string {
// 使用的时候,需要传obj的指针
getObj := reflect.TypeOf(obj)
// 将err接口断言为具体类型
if errs, ok := err.(validator.ValidationErrors); ok {
// 断言成功
for _, e := range errs {
// 循环每一个错误信息
// 根据报错字段名,获取结构体的具体字段
if f, exits := getObj.Elem().FieldByName(e.Field()); exits {
msg := f.Tag.Get("msg")
return msg
}
}
}
return err.Error()
}
func main() {
router := gin.Default()
router.POST("/users", func(c *gin.Context) {
var userInfo UserInfo
err := c.ShouldBindJSON(&userInfo)
if err != nil {
fmt.Println(err)
c.JSON(200, gin.H{"msg": GetValidMsg(err, &userInfo)})
return
}
c.JSON(200, userInfo)
})
router.Run(":8000")
}