【笔记】Go语言的Validator
前言
Go语言通过Validator实现结构体的字段值验证,在实例化结构体变量时只有所有字段的值都符合校验规则才能被成功实例化
下载依赖
1 | go get github.com/go-playground/validator/v10 |
初始化
validate.SetTagName("")
:设置标签名
validate
:缺省值,标签名
1 | package main |
标签分隔符
,
:需要通过多个验证|
:只需要通过一种验证-
:跳过该字段的验证
字符串校验
alpha
:字母alphanum
:字母和数字alphaunicode
:字母和Unicode字符(包含中文)alphanumunicode
:字母和数字和Unicode字符(包含中文)ascii
:ASCII字符contains=字符串
:包含指定字符串excludes=字符串
:不包含指定字符串startswith=字符串
:以指定字符串开头endswith=字符串
:以指定字符串结尾startsnowith=字符串
:不以指定字符串开头endsnowith=字符串
:不以指定字符串结尾lowercase
:字符串中的字母全是小写uppercase
:字符串中的字母全是大写boolean
:布尔值字符串multibyte
:多字节字符串number
:整型数值字符串numeric
:整型数值和浮点型数值字符串
格式化字符串校验
base64
:Base64格式字符串base64url
:Base64格式URL字符串credit_card
:信用卡号字符串datetime=2006-01-02 15:04:05
:指定日期格式的字符串e164
:包含国家区号的手机号格式字符串,如:+8613800000000
hexadecimal
:16进制字符串json
:JSON格式字符串jwt
:JWT格式字符串longitude
:经度格式字符串latitude
:纬度格式字符串timezone
:时区格式字符串,如:Asia/Shanghai
iscolor
:颜色字符串country_code
:国家代码字符串
网络地址校验
fqdn
:域名hostname
:主机名hostname_port
:主机名和端口号ip
:IPv4地址和IPv6地址ipv4
:IPv4地址ipv6
:IPv6地址mac
:MAC地址uri
:统一资源标识符url
:统一资源定位符url_encode
:URL编码的统一资源定位符
数值比较校验
eq=0
:等于gt=0
:大于lt=0
:小于get=0
:大于等于let=0
:小于等于ne=0
:不等于
必填校验
必填
- 必须不为零值
required
:必填required_if=字段名 值
:当指定字段为指定值时,必填required_unless=字段名 值
:当指定字段不为指定值时,必填required_with=字段名
:当指定字段的值不为零值时,必填required_with_all=字段名1 字段名2
:当指定多个字段的值都不为零值时,必填required_without=字段名
:当指定字段为零值时,必填required_without_all=字段名1 字段名2
:当指定多个字段都为零值时,必填
必不填
- 必须为零值
excluded_with=字段名
:当指定字段的值不为零值时,必不填excluded_with_all=字段名1 字段名2
:当指定多个字段的值都不为零值时,必不填excluded_without=字段名
:当指定字段为零值时,必不填excluded_without_all=字段名1 字段名2
:当指定多个字段都为零值时,必不填
目录文件路径校验
dir
:目录路径file
:文件路径
其他校验
isdefault
:零值len
:字符串长度max
:最大值,可用于数值、字符串、切片、集合min
:最小值,可用于数值、字符串、切片、集合oneof=<value_1> <value_2>
:所有枚举的值的其中之一omitempty
:如果没有值,就跳过该字段的验证dive
:深入一层验证,通常在切片类型字段或映射类型字段上使用
相对于其他字段校验
相对于其他基本类型的字段校验
eqfield=字段名
:等于当前结构体的指定字段值gtfield=字段名
:大于当前结构体的指定字段值ltfield=字段名
:小于当前结构体的指定字段值gtefield=字段名
:大于等于当前结构体的指定字段值ltefield=字段名
:小于等于当前结构体的指定字段值nefield=字段名
:不等于当前结构体的指定字段值fieldcontains=字段名1 字段名2
:包含在当前结构体的指定多个字段值fieldexcludes=字段名1 字段名2
:不包含在当前结构体的指定多个字段值
相对于其他结构体类型的字段校验
eqcsfield=字段名.字段名
:等于子结构体的指定字段值gtcsfield=字段名.字段名
:大于子结构体的指定字段值ltcsfield=字段名.字段名
:小于子结构体的指定字段值gtecsfield=字段名.字段名
:大于等于子结构体的指定字段值ltecsfield=字段名.字段名
:小于等于子结构体的指定字段值necsfield=字段名.字段名
:不等于子结构体的指定字段值
在结构体上定义校验标签
min=1
:切片的最小长度min=2
:每个字符串的最小长度
1 | package model |
自定义字段类型的校验
1 | type 结构体名 struct { |
自定义结构体的校验
1 | type 结构体名 struct {} |
自定义标签的校验
1 | type 结构体名 struct { |
Map类型数据验证
- 定义一个与原数据相同结构的Map类型数据作为验证规则
1 | func main() { |
- 如果Map中存储了切片,只需要指定一次验证规则即可
1 | func main() { |
通过Map类型的规则验证结构体
1 | type 结构体名 struct { |