golang 数据校验器
golang中使用数据校验功能
安装第三方模块
go get gopkg.in/go-playground/validator.v9
基本使用
package main
import (
"fmt"
"gopkg.in/go-playground/validator.v9"
)
type User struct {
Name string `validate:"required"`
Age int `validate:"gte=0,lte=150"`
}
func main() {
user := User{
Age: 180,
}
validate := validator.New()
err := validate.Struct(user)
if err != nil {
/*
Key: 'User.Name' Error:Field validation for 'Name' failed on the 'required' tag
Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
*/
fmt.Println(err)
}
}
在需要结构体的字段中加上key为validate
的tag即可
常用的tag验证
required
:参数为必须参数
lte
: 设置最大值
gte
:设置最小值
email
: 必须为邮箱格式
url
: 必须为合法的url格式
len
: 指定字符的长度
max
: 和lte
一样,设置最大值
min
:和gte
一样,设置最小值
eq
: 值必须等于制定的值,用于字符串和数字
ne
: 值必须不等于指定的值, 用于字符串和数字
eqfield
: 值必须和指定的字段的值相等
nefield
:值必须和指定的字段的值不等
oneof
: 相当于枚举, 必须为指定的值的其中一个,不同的值之间用空格隔开
base64
: 必须为合法的base64字符串
contains
: 值中必须包含给定的字符串
containsany
: 值中必须有给定的字符串的任意一个字符
excludes
: 值必须不包含给定的字符串
excludesall
: 值中必须不包含给定的字符串中的任意一个
startswith
: 必须以给定的字符串开头
endwith
: 必须以给定的字符结尾
更多文档 https://godoc.org/gopkg.in/go-playground/validator.v9
翻译报错信息
当验证出错时的err不为nil,打印出来的err为英文的字符串
package main
import (
"fmt"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"gopkg.in/go-playground/validator.v9"
zhTrans "gopkg.in/go-playground/validator.v9/translations/zh"
)
type User struct {
Name string `validate:"required,oneof=ivy niu bi"`
Hobby string `validate:"containsany=@8888"`
Age int `validate:"gte=0,lte=140,max=150"`
}
func main() {
validate := validator.New()
zhCn := zh.New()
uni := ut.New(zhCn)
trans, _ := uni.GetTranslator("zh")
err := zhTrans.RegisterDefaultTranslations(validate, trans)
if err != nil {
fmt.Println(err)
}
user := User{
Age: 145,
Name: "ivy6",
Hobby: "666",
}
err = validate.Struct(user)
if err != nil {
if _, ok := err.(*validator.InvalidValidationError); !ok {
if errs, ok := err.(validator.ValidationErrors); ok {
for _, err := range errs {
/*
Name:Name必须是[ivy niu bi]中的一个
Hobby:Hobby必须包含至少一个以下字符'@8888'
Age:Age必须小于或等于140
*/
fmt.Printf("%s:%s \n", err.StructField(), err.Translate(trans))
}
}
}
}
}
自定义验证规则
package main
import (
"fmt"
"gopkg.in/go-playground/validator.v9"
)
type User struct {
Name string `validate:"test"`
}
func main() {
validate := validator.New()
validate.RegisterValidation("test", func(fl validator.FieldLevel) bool {
return fl.Field().String() == "test"
})
//Key: 'User.Name' Error:Field validation for 'Name' failed on the 'test' tag
fmt.Println(validate.Struct(new(User)))
}
翻译字段名
package main
import (
"fmt"
"gopkg.in/go-playground/validator.v9"
"reflect"
)
type User struct {
Name string `validate:"required" label:"用户名"`
}
func main() {
validate := validator.New()
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
return field.Tag.Get("label")
})
//Key: 'User.用户名' Error:Field validation for '用户名' failed on the 'required' tag
fmt.Println(validate.Struct(new(User)))
}