1.装置validator
go get -u github.com/go-playground/validator/v10
2.应用
package mainimport ( "fmt" "github.com/go-playground/validator/v10" //"gopkg.in/go-playground/validator.v10" "net/http")type User struct{ UserName string `validate:"min=3,max=13"` Password string `validate:"min=3,max=13"`}func main() { u := User{UserName: "z"} validate := validator.New() fmt.Println(u) err := validate.Struct(u) fmt.Println("err:",err)}
谬误提醒
{z }err: Key: 'User.UserName' Error:Field validation for 'UserName' failed on the 'min' tagKey: 'User.Password' Error:Field validation for 'Password' failed on the 'min' tag
3.校验规定
len:length 等于,长度相等max:小于等于min:大于等于eq:等于,字符串相等ne:不等于gt:大于gte:大于等于lt:小于lte:小于等于,例如lte=10;oneof:值中的一个,例如oneof=1 2反对工夫范畴的比拟lte 工夫 RegTime time.Time `validate:"lte"` 小于等于以后工夫跨字段束缚eqfield=ConfirmPasswordeqcsfield=InnerStructField.Field字符串规定contains=:蕴含参数子串containsany:蕴含参数中任意的 UNICODE 字符containsrune:蕴含参数示意的 rune 字符excludes:不蕴含参数子串excludesall:不蕴含参数中任意的 UNICODE 字符excludesrune:不蕴含参数示意的 rune 字符startswith:以参数子串为前缀endswith:以参数子串为后缀应用unqiue来指定唯一性束缚,对不同类型的解决如下:对于数组和切片,unique束缚没有反复的元素;对于map,unique束缚没有反复的值;对于元素类型为构造体的切片,unique束缚构造体对象的某个字段不反复,通过unqiue=name非凡规定-:跳过该字段,不测验;|:应用多个束缚,只须要满足其中一个,例如rgb|rgba;required:字段必须设置,不能为默认值;omitempty:如果字段未设置,则疏忽它。
4.自定义规定及自定义提示信息
package mainimport ( "fmt" "github.com/go-playground/validator/v10" "log" "reflect" //"gopkg.in/go-playground/validator.v10" "net/http")type User struct{ UserName string `validate:"minReg" reg_error_info:"用户名至多6个字符"` //通过reg_error_info标签记录 //reg_error_info也能够是标记谬误的惟一标识,通过传入的local_language 从库中或者缓存中找到对应国家的谬误提示信息 Password string `validate:"minReg" reg_error_info:"明码至多6个字符"` }//自定义的校验规定,能够应用正则表达式进行匹配,这里仅仅应用了长度判断func minRegFun(f validator.FieldLevel) bool { value := f.Field().String() log.Println(f) if len(value) < 6 { return false }else { return true }}func main() { u := User{UserName: "zzzzzz",Password: "xxxx"} validate := validator.New() validate.RegisterValidation("minReg", minRegFun) //注册自定义的校验函数 minReg和validate tag值保持一致 err := validate.Struct(u) //校验 errorInfo := processErr(u, err) //处理错误信息 if len(errorInfo) != 0 { log.Println(errorInfo) } else { log.Println("校验通过") }}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() //获取是哪个字段不合乎格局 field, ok := reflect.TypeOf(u).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 ""}
后果
校验通过2021/08/03 10:10:15 Password:明码至多6个字符