Golang验证库go-playground/validator使用方法以及错误信息中文化
Published on:2022-10-15
一、验证规则
标记之间特殊符号说明
- 逗号(
,
):把多个验证标记隔开。注意
:隔开逗号之间不能有空格,validate:"lt=0,gt=100"
,逗号那里不能有空格,否则panic - 横线(
-
):跳过该字段不验证 - 竖线(
|
):使用多个验证标记,但是只需满足其中一个即可 - required:表示该字段值必输设置,且不能为默认值
- omitempty:如果字段未设置,则忽略它
范围比较验证
doc: https://github.com/go-playground/validator/blob/master/README.md#comparisons
范围验证: 切片、数组和map、字符串,验证其长度;数值,验证大小范围
- lte:小于等于参数值,
validate:"lte=3"
(小于等于3) - gte:大于等于参数值,
validate:"lte=0,gte=120"
(大于等于0小于等于120) - lt:小于参数值,
validate:"lt=3"
(小于3) - gt:大于参数值,
validate:"lt=0,gt=120"
(大于0小于120) - len:等于参数值,
validate:"len=2"
- max:大于等于参数值,
validate:"max=2"
(大于等于2) - min:小于等于参数值,
validate:"min=2,max=10"
(大于等于2小于等于10) - ne:不等于,
validate:"ne=2"
(不等于2) - oneof:只能是列举出的值其中一个,这些值必须是数值或字符串,以空格分隔,如果字符串中有空格,将字符串用单引号包围,
validate:"oneof=red green"
例子:
type User struct { Name string `json:"name" validate:"min=0,max=35"` Age unit8 `json:"age" validate:"lte=0,gte=90"` }
更多功能请参看文档 validator comparisons doc
字符串验证
doc: https://github.com/go-playground/validator/blob/master/README.md#strings
- contains:包含参数子串,
validate:"contains=tom"
(字段的字符串值包含tom) - excludes:包含参数子串,
validate:"excludes=tom"
(字段的字符串值不包含tom) - startswith:以参数子串为前缀,
validate:"startswith=golang"
- endswith:以参数子串为后缀,
validate:"startswith=world"
例子:
type User struct { Name string `validate:"contains=tom"` Age int `validate:"min=1"` }
更多功能请参看文档 validator strings doc
字段验证
doc: https://github.com/go-playground/validator/blob/master/README.md#fields
eqcsfield:跨不同结构体字段验证,比如说 Struct1 Filed1,与结构体Struct2 Field2相等,
type Struct1 struct { Field1 string `validate:eqcsfield=Struct2.Field2` Struct2 struct { Field2 string } }
- necsfield:跨不同结构体字段不相等
- eqfield:同一结构体字段验证相等,最常见的就是输入2次密码验证
type User struct { Name string `validate:"lte=4"` Age int `validate:"min=20"` Password string `validate:"min=10"` Password2 string `validate:"eqfield=Password"` }
nefield:同一结构体字段验证不相等
type User struct { Name string `validate:"lte=4"` Age int `validate:"min=20"` Password string `validate:"min=10,nefield=Name"` }
- gtefield:大于等于同一结构体字段,
validate:"gtefiled=Field2"
- ltefield:小于等于同一结构体字段
更多功能请参看文档:validator Fields DOC
网络验证
doc: https://github.com/go-playground/validator/blob/master/README.md#network
- ip:字段值是否包含有效的IP地址,
validate:"ip"
- ipv4:字段值是否包含有效的ipv4地址,
validate:"ipv4"
- ipv6:字段值是否包含有效的ipv6地址,
validate:"ipv6"
- uri:字段值是否包含有效的uri,
validate:"uri"
- url:字段值是否包含有效的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))
}
留言列表(0)
加载更多
留言
开源项目
- B5LaravelCMF:基于laravel9+bootstrap3实现的快速开发后台
- B5YiiCMF:基于Yii2+bootstrap3 实现的快速开发后台管理系统
- B5ThinkCmf:基于ThinkPHP6+bootstrap3 实现的快速开发后台管理系统
- B5GoCmf:gin + sqlx +bootstrap 实现后端管理系统
- See also:gitee.com@b5net
最新评论
小白
:大佬您好 请问一下 http://b5laravelcmf.b5net.com/admin这个演示网址的全部代码有吗,gitee上不全呢,还能提供一下吗,感激不尽阿
tz
:大佬 B5YiiCMF 还开放吗
weifox
on GoLang常用的三方库
:还有 https://github.com/golang-module/carbon
php
:关于导出功能:1、B5thinkCMF部署后 参数的导出功能点击后就白屏了,不知道是哪里有问题?2、人员部门的导出功能没看懂怎么配置的? 只是启用exportshow=true吗
方便的话请答复下,谢谢!
初学者
:您好! 部署了您的B5ThinkCMF,请教下 使用新增功能如何实现二级联动呢 ?谢谢
11
:22
pcy
:前排围观
Louis
:冰舞的博客使用yii框架做的吧,B5ThinkCMF在本地部署后,登录系统的响应时间要比B5YiiCMF的登录时间长,还有一些Bug待修复
w1
on Electron+vue搭建项目或将vue项目转为electron
:大佬
34
:感谢你的开源项目
文章分类
标签