介绍
Validator 是基于 tag(标记)实现结构体和单个字段的值验证库,它包含以下功能:
安装:
go get github.com/go-playground/validator/v10
然后将 Validator 包导入到代码中:
import "github.com/go-playground/validator/v10"
变量验证
func (*validator.Validate).Var(field interface{}, tag string) error
它接收一个 interface{} 空接口类型的 field 和一个 string 类型的 tag,返回传递的非法值得无效验证错误,否则将 nil 或 ValidationErrors 作为错误。如果错误不是 nil,则需要断言错误去访问错误数组,例如:
validationErrors := err.(validator.ValidationErrors)
如果是验证数组、slice 和 map,可能会包含多个错误。
示例代码:
func main() {
validate := validator.New()
// 验证变量
email := "admin#admin.com"
email := ""
err := validate.Var(email, "required,email")
if err != nil {
validationErrors := err.(validator.ValidationErrors)
fmt.Println(validationErrors)
// output: Key: '' Error:Field validation for '' failed on the 'email' tag
// output: Key: '' Error:Field validation for '' failed on the 'required' tag
return
结构体验证
结构体验证结构体公开的字段,并自动验证嵌套结构体,除非另有说明。
func (*validator.Validate).Struct(s interface{}) error
它接收一个 interface{} 空接口类型的 s,返回传递的非法值得无效验证错误,否则将 nil 或 ValidationErrors 作为错误。如果错误不是 nil,则需要断言错误去访问错误数组,例如:
validationErrors := err.(validator.ValidationErrors)
实际上,Struct 方法是调用的 StructCtx 方法,因为本文不是源码讲解,所以此处不展开赘述,如有兴趣,可以查看源码。
示例代码:
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: "[email protected]",
err = validate.Struct(user)
if err != nil {
validationErrors := err.(validator.ValidationErrors)
// output: Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
// fmt.Println(validationErrors)
fmt.Println(validationErrors.Translate(trans))
return
细心的读者可能已经发现,错误输出信息并不友好,错误输出信息中的字段不仅没有使用备用名(首字母小写的字段名),也没有翻译为中文。通过改动代码,使错误输出信息变得友好。
注册一个函数,获取结构体字段的备用名称:
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return "j"
return name
错误信息翻译为中文:
zh := zh.New()
uni = ut.New(zh)
trans, _ := uni.GetTranslator("zh")
_ = zh_translations.RegisterDefaultTranslations(validate, trans)
标签
通过以上章节的内容,读者应该已经了解到 Validator 是一个基于 tag(标签),实现结构体和单个字段的值验证库。
本章节列举一些比较常用的标签:
oneof
required
unique
isDefault
email
转自: Golang语言开发栈
最后编辑: kuteng 文档更新时间: 2021-10-21 09:19 作者:kuteng