// 不能为空,并且不能没有这个字段 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") }