1. 原理:
①. 将验证规则写在struct对字段tag里,再通过反射(reflect)获取struct的tag,实现数据验证.
(1). 安装:
go get github.com/go-playground/validator/v10
(2). 验证:
import (
"github.com/go-playground/validator/v10"
)
type Users struct {
Phone string `form:"phone" json:"phone" validate:"required"`
Passwd string `form:"passwd" json:"passwd" validate:"required,max=20,min=6"`
Code string `form:"code" json:"code" validate:"required,len=6"`
}
func main() {
users := &Users{
Phone: "1326654487",
Passwd: "123",
Code: "123456",
}
validate := validator.New()
if err := validate.Struct(users); err != nil {
for _, err := range err.(validator.ValidationErrors) {
fmt.Println(err)
return
}
}
}
(3). 验证规则:
①. required:
a. 必填
email:验证字符串是email格式;例:“email”
url:这将验证字符串值包含有效的网址;例:“url”
max:字符串最大长度;例:“max=20”
min:字符串最小长度;例:“min=6”
excludesall:不能包含特殊字符;例:“excludesall=0x2C”//注意这里用十六进制表示。
len:字符长度必须等于n,或者数组、切片、map的len值为n,即包含的项目数;例:“len=6”
eq:数字等于n,或者或者数组、切片、map的len值为n,即包含的项目数;例:“eq=6”
ne:数字不等于n,或者或者数组、切片、map的len值不等于为n,即包含的项目数不为n,其和eq相反;例:“ne=6”
gt:数字大于n,或者或者数组、切片、map的len值大于n,即包含的项目数大于n;例:“gt=6”
gte:数字大于或等于n,或者或者数组、切片、map的len值大于或等于n,即包含的项目数大于或等于n;例:“gte=6”
lt:数字小于n,或者或者数组、切片、map的len值小于n,即包含的项目数小于n;例:“lt=6”
lte:数字小于或等于n,或者或者数组、切片、map的len值小于或等于n,即包含的项目数小于或等于n;例:“lte=6”
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳
(4). 跨字段验证:
如比较输入密码和确认密码是否一致等类似场景
eqfield=Field: 必须等于 Field 的值;
nefield=Field: 必须不等于 Field 的值;
gtfield=Field: 必须大于 Field 的值;
gtefield=Field: 必须大于等于 Field 的值;
ltfield=Field: 必须小于 Field 的值;
ltefield=Field: 必须小于等于 Field 的值;
eqcsfield=Other.Field: 必须等于 struct Other 中 Field 的值;
necsfield=Other.Field: 必须不等于 struct Other 中 Field 的值;
gtcsfield=Other.Field: 必须大于 struct Other 中 Field 的值;
gtecsfield=Other.Field: 必须大于等于 struct Other 中 Field 的值;
ltcsfield=Other.Field: 必须小于 struct Other 中 Field 的值;
ltecsfield=Other.Field: 必须小于等于 struct Other 中 Field 的值;
type UserReg struct {
Passwd string `form:"passwd" json:"passwd" validate:"required,max=20,min=6"`
Repasswd string `form:"repasswd" json:"repasswd" validate:"required,max=20,min=6,eqfield=Passwd"`
}
(5). 自定义验证类型:
type Users struct {
Name string `form:"name" json:"name" validate:"required,CustomValidationErrors"`//包含自定义函数
}
func main() {
users := &Users{
Name: "admin",
}
validate := validator.New()
// 注册自定义函数
_ = validate.RegisterValidation("CustomValidationErrors", CustomValidationErrors)
err := validate.Struct(users)
...
}
func CustomValidationErrors(fl validator.FieldLevel) bool {
return fl.Field().String() != "admin"
}
(6). 安装中文包:
go get github.com/go-playground/universal-translator
go get github.com/go-playground/locales
(7). 使用中文包:
package main
import (
"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"
)
type Users struct {
Name string `form:"name" json:"name" validate:"required"`
}
func main() {
users := &Users{
Name: "admin",
}
uni := ut.New(zh.New())
trans, _ := uni.GetTranslator("zh")
validate := validator.New()
// 验证器注册翻译器
if err := zh_translations.RegisterDefaultTranslations(validate, trans); err != nil {
fmt.Println(err)
// 提示name不能为空
}
err = validate.Struct(users)
...
}
(8). 字段名加入中文:
源码: https://github.com/go-playground/validator/blob/master/validator_instance.go