一、验证规则

标记之间特殊符号说明

, 注意validate:"lt=0,gt=100"-|

范围比较验证

doc: https://github.com/go-playground/validator/blob/master/README.md#comparisons

范围验证: 切片、数组和map、字符串,验证其长度;数值,验证大小范围

validate:"lte=3"validate:"lte=0,gte=120"validate:"lt=3"validate:"lt=0,gt=120"validate:"len=2"validate:"max=2"validate:"min=2,max=10"validate:"ne=2"validate:"oneof=red green"

例子:

更多功能请参看文档 validator comparisons doc

字符串验证

doc: https://github.com/go-playground/validator/blob/master/README.md#strings

validate:"contains=tom"validate:"excludes=tom"validate:"startswith=golang"validate:"startswith=world"

例子:

更多功能请参看文档 validator strings doc

字段验证

doc: https://github.com/go-playground/validator/blob/master/README.md#fields

eqcsfield:跨不同结构体字段验证,比如说 Struct1 Filed1,与结构体Struct2 Field2相等,

  • necsfield:跨不同结构体字段不相等
  • eqfield:同一结构体字段验证相等,最常见的就是输入2次密码验证

nefield:同一结构体字段验证不相等

validate:"gtefiled=Field2"

更多功能请参看文档:validator Fields DOC

网络验证

doc: https://github.com/go-playground/validator/blob/master/README.md#network

validate:"ip"validate:"ipv4"validate:"ipv6"validate:"uri"validate:"url"

二、中文

根据文档书写统一工具

type ValidateCtx struct {
*validator.Validate
trans ut.Translator
}
func LoadValidator() {
zhTranslator := zh.New()
uni := ut.New(zhTranslator, zhTranslator)

trans, _ := uni.GetTranslator("zh")

validate := validator.New()
//通过自定义标签label来替换字段名
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("label"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
_ = zhTranslations.RegisterDefaultTranslations(validate, trans)

G_Validate = &ValidateCtx{validate,trans}
}

func (vc *ValidateCtx)GetError(errs error) string {
errStr :=""
for _, err := range errs.(validator.ValidationErrors) {
if vc.trans!=nil {
errStr = err.Translate(vc.trans)
}else{
errStr = err.Field()+"验证不符合"+err.Tag()
}
break
}
return errStr
}

使用

定义结构体,label替代字段英文

type adminExtend struct {
Roles string `json:"roles" validate:"required" label:"所属角色"`
Struct string `json:"struct" validate:"required" label:"组织架构"`
Pos string `json:"pos" validate:"required" label:"岗位"`
Pwd string `json:"pwd" validate:"omitempty,min=6,max=12" label:"密码"`
}
extend := &adminExtend{}
err := ctx.ShouldBindBodyWith(extend, binding.JSON)
if err != nil {
return errors.New("数据绑定错误")
}
err1 := core.G_Validate.Struct(extend)
if err1 != nil {
return errors.New(core.G_Validate.GetError(err1))
}