原文连接:https://segmentfault.com/a/1190000040445612
笔者针对参数为指针的情况做了一点小优化
这里我们用validator
用来做参数校验,gin默认的github.com/go-playground/validator
,可以直接使用
除此之外还有一些其他的工具也挺好用的,例如:
- github.com/asaskevich/govalidator
这里笔者就使用gin默认的了
然后开始使用,我们可以用来校验结构体
type UserBasic struct {utils.ProcessErr(userParams, err)
UserId uint64 `gorm:"column:user_id" json:"userId"`
UserNumber string `gorm:"column:user_number" json:"userNumber"`
Name string `validate:"required" reg_error_info:"姓名不能为空"`
Age uint8 `validate:"lt=0|gt=150" reg_error_info:"年龄不合法"`
PassWord string `gorm:"column:password" json:"password"`
PhoneNum string `validate:"RegexPhone" reg_error_info:"手机号格式不正确"`
Email string `validate:"email" reg_error_info:"email为空或格式不正确"`
...其他省略
}
这时一般返回的错误是这样的
当然这样不友好,我们希望能够返回自定义的提醒信息,我们封装一个方法即可
// ProcessErr go validator参数校验器自定义规则及提示
func ProcessErr(u interface{}, err error) string {
if err == nil { //如果为nil 说明校验通过
return ""
}
invalid, ok := err.(*validator.InvalidValidationError) //如果是输入参数无效,则直接返回输入参数错误
if ok {
return "输入参数错误:" + invalid.Error()
}
validationErrs := err.(validator.ValidationErrors) //断言是ValidationErrors
for _, validationErr := range validationErrs {
fieldName := validationErr.Field() //获取是哪个字段不符合格式
typeOf := reflect.TypeOf(u)
// 如果是指针,获取其属性
if typeOf.Kind() == reflect.Ptr {
typeOf = typeOf.Elem()
}
field, ok := typeOf.FieldByName(fieldName) //通过反射获取filed
if ok {
errorInfo := field.Tag.Get("reg_error_info") // 获取field对应的reg_error_info tag值
return fieldName + ":" + errorInfo // 返回错误
} else {
return "缺失reg_error_info"
}
}
return ""
}
再调用我们的方法即可
// 参数校验
validate := validator.New()
// 自定义校验
validate.RegisterValidation("RegexPhone", utils.RegexPhone)
if err := validate.Struct(userParams); err != nil {
// 返回我们tag中的提示语
c.JSON(-1, response.Err.WithMsg(utils.ProcessErr(userParams, err)))
return
}
现在就是我们想要的结果了