Validator 参数验证
Validator 简介
Validator 是基于 tag(标记)实现结构体和单个字段的值验证库,它包含以下功能:
- 使用验证 tag(标记)或自定义验证器进行跨字段和跨结构体验证。
- 关于 slice、数组和 map,允许验证多维字段的任何或所有级别。
- 能够深入 map 键和值进行验证。
- 通过在验证之前确定接口的基础类型来处理类型接口。
- 处理自定义字段类型(如 sql 驱动程序 Valuer)。
- 别名验证标记,它允许将多个验证映射到单个标记,以便更轻松地定义结构体上的验证。
- 提取自定义的字段名称,例如,可以指定在验证时提取 JSON 名称,并在生成的 FieldError 中使用该名称。
- 可自定义 i18n 错误消息。
- Web 框架 gin 的默认验证器。
安装
1
| go get github.com/go-playground/validator/v10
|
使用
单个变量验证
1 2 3 4 5 6 7 8 9 10 11
| func main() { validate := validator.New() email := "admin#admin.com" err := validate.Var(email, "required,email") if err != nil { validationErrors := err.(validator.ValidationErrors) fmt.Println(validationErrors) return } }
|
结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| func main() { validate = validator.New() type User struct { ID int64 `json:"id" validate:"gt=0"` Name string `json:"name" validate:"required"` Gender string `json:"gender" validate:"required,oneof=man woman"` Age uint8 `json:"age" validate:"required,gte=0,lte=130"` Email string `json:"email" validate:"required,email"` } user := &User{ ID: 1, Name: "frank", Gender: "boy", Age: 180, Email: "gopher@88.com", } err = validate.Struct(user) if err != nil { validationErrors := err.(validator.ValidationErrors) fmt.Println(validationErrors) return } }
|
错误信息翻译为中文
安装翻译包
1 2
| go get -u github.com/go-playground/locales go get -u github.com/go-playground/universal-translator
|
导入
1 2 3 4
| "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zh_translations "github.com/go-playground/validator/v10/translations/zh"
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| func main() { validate := validator.New() type User struct { ID int64 `json:"id" validate:"gt=0"` Name string `json:"name" validate:"required"` Gender string `json:"gender" validate:"required,oneof=man woman"` Age uint8 `json:"age" validate:"required,gte=0,lte=130"` Email string `json:"email" validate:"required,email"` } user := &User{ ID: 1, Name: "frank", Gender: "boy", Age: 180, Email: "gopher@88.com", } validate.RegisterTagNameFunc(func(fld reflect.StructField) string { name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0] if name == "-" { return "j" } return name }) uni := ut.New(zh.New()) trans, _ := uni.GetTranslator("zh") _ = zh_translations.RegisterDefaultTranslations(validate, trans)
err := validate.Struct(user) if err != nil { for _, err := range err.(validator.ValidationErrors) { fmt.Println(err.Translate(trans)) } } }
|