Golang之数据验证库validator的使用

1,603 阅读2分钟

简介

validator的作用做数据验证,能对结构体中的字段进行验证。比如结构体中有账号、密码,一般需要检查密码的长度是否满足要求,是否有大小写等等。

安装

go get github.com/go-playground/validator/v10

使用

validator通过检查结构体标签,来判断数据是否满足要求。

`validate:"tag1,tag2"`

语法:标签以validate为前缀,类似json,多个验证用逗号隔开。以下示例:

type P struct{
    //Name的长度不能小于6,不能大于22.
    Name string `validate:"min=6,max=22"`
}

注意:字段必须以大写字母开头,不然无法被验证库获取。

validator有很多tag。下面说一些比较常用的标签。

判断是否为空

  • required:字段不能为类型0值。

判断长度

  • min: 字段的最小长度。常用于密码校验。
  • max: 字段的最大长度。同min使用一样。
  • len: 字段必须与指定的长度一致,否则验证失败。

判断内容

  • eq: 验证string或者数值类型的值是否相等.
  • ne: 验证string或数值类型的值是否不相等。
  • eqfiled: 与另一个字段的值是否相等.
  • nefiled: 与另一个字段的值是否不相等。

判断数值大小

  • gt: 是否大于给定的数值.如果判断类值是time.TIme,会根据当前时间来判断。
  • gte: 大于等于.如果是time.TIme,同上.
  • lt: 是否小于.
  • lte: 小于等于.

自定义错误消息

官方示例

在v9之前,validator验证失败返回的错误信息很难看。

"Key: 'User.Password' Error:Field validation for 'Password' failed on the 'min' tag"

更新到v9之后,可以将晦涩难懂的信息转换为一目了然的文字。

如果要将错误信息转换为中文,将en改成zh,对应的包也改成zh。

import (
  "fmt""github.com/go-playground/locales/en"
  ut "github.com/go-playground/universal-translator"
  "github.com/go-playground/validator.v10"
  en_translations "github.com/go-playground/validator/v10/translations/en"
)en := en.New()
uni = ut.New(en, en)
trans, _ := uni.GetTranslator("en")validate = validator.New()
en_translations.RegisterDefaultTranslations(validate, trans)err := validate.Struct(user)
if err != nil {
  errs := err.(validator.ValidationErrors)
  //转换出来的errs是个map,因为可能包含多个字段的错误提示。
  fmt.Println(errs.Translate(trans))
}

常见配置

type User struct{
    Name string `validate:"required"`//Name不为能空
    Age int `validate:"gt=0"`//Age必须大于0
}
​
func main(){
    validate :=validator.New()
    user := &User{
        Name: "",
        Age: 30
    }
    validate.Struct(user)
}