1. 装置 validator
go get -u github.com/go-playground/validator/v10
2. 应用
package main
import (
"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' tag
Key: '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=ConfirmPassword
eqcsfield=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 main
import (
"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 个字符