validator - Go 结构体验证库

本文翻译整理自:https://github.com/go-playground/validator


一、关于 validator

validator 包实现了基于标签的结构体和字段值验证功能。


相关链接资源


关键功能特性

具有以下独特功能:
1、通过验证标签或自定义验证器实现跨字段和跨结构体验证
2、支持切片、数组和映射的多层级嵌套验证
3、可同时验证映射的键和值
4、验证前自动识别接口的实际类型
5、支持自定义字段类型(如实现了 sql.driver.Valuer 接口的类型)
6、别名验证标签,可将多个验证映射到单个标签以简化结构体定义
7、可提取自定义字段名(如提取 JSON 字段名用于错误提示)
8、支持可定制的国际化错误消息
9、作为 gin 框架的默认验证器(从 v8 升级到 v9 的指南见 https://github.com/go-playground/validator/tree/master/_examples/gin-upgrading-overriding


二、维护者招募

有意参与维护本项目的开发者请阅读 https://github.com/go-playground/validator/discussions/1330 中的讨论。


三、安装

使用 go get 安装:

go get github.com/go-playground/validator/v10

然后在代码中导入:

import "github.com/go-playground/validator/v10"

四、错误返回值

验证函数返回 error 类型,这种设计避免了以下讨论中提到的问题(err 总是 != nil):

验证器仅对错误的验证输入返回 InvalidValidationError,正常情况下返回 nil 或 ValidationErrors。因此代码中只需检查返回的 error 是否为 nil,必要时可将其转换为 ValidationErrors 类型:

err := validate.Struct(mystruct)
validationErrors := err.(validator.ValidationErrors)

五、使用文档

详细用法请参考:https://pkg.go.dev/github.com/go-playground/validator/v10


示例代码


六、内置验证规则


特别说明

对于新用户,强烈建议使用 WithRequiredStructEnabled 选项初始化验证器,该选项启用了将在 v11+ 版本成为默认行为的新特性:

validate := validator.New(validator.WithRequiredStructEnabled())

字段验证

标签描述
eqcsfield等于另一个相对字段
eqfield等于另一个字段
fieldcontains字段包含指定字符
fieldexcludes字段不包含指定字符
gtcsfield大于另一个相对字段
gtecsfield大于等于另一个相对字段
gtefield大于等于另一个字段
gtfield大于另一个字段
ltcsfield小于另一个相对字段
ltecsfield小于等于另一个相对字段
ltefield小于等于另一个字段
ltfield小于另一个字段
necsfield不等于另一个相对字段
nefield不等于另一个字段

网络验证

标签描述
cidr无类别域间路由 CIDR
cidrv4IPv4 CIDR
cidrv6IPv6 CIDR
datauri数据 URL
fqdn完全限定域名
hostname主机名 (RFC 952)
hostname_port主机端口
hostname_rfc1123主机名 (RFC 1123)
ipIP 地址
ip4_addrIPv4 地址
ip6_addrIPv6 地址
ip_addrIP 地址
ipv4IPv4 地址
ipv6IPv6 地址
macMAC 地址
tcp4_addrTCPv4 地址
tcp6_addrTCPv6 地址
tcp_addrTCP 地址
udp4_addrUDPv4 地址
udp6_addrUDPv6 地址
udp_addrUDP 地址
unix_addrUnix 域套接字地址
uriURI 字符串
urlURL 字符串
http_urlHTTP URL 字符串
url_encodedURL 编码字符串
urn_rfc2141URN (RFC 2141) 字符串

字符串验证

标签描述
alpha仅字母
alphanum字母数字
alphanumunicodeUnicode 字母数字
alphaunicodeUnicode 字母
asciiASCII 字符
boolean布尔值
contains包含指定字符串
containsany包含任意指定字符
containsrune包含指定 rune
endsnotwith不以指定字符串结尾
endswith以指定字符串结尾
excludes不包含指定字符串
excludesall不包含任何指定字符
excludesrune不包含指定 rune
lowercase小写字母
multibyte多字节字符
number数字
numeric数值
printascii可打印 ASCII 字符
startsnotwith不以指定字符串开头
startswith以指定字符串开头
uppercase大写字母

格式验证

标签描述
base64Base64 字符串
base64urlBase64URL 字符串
base64rawurlBase64RawURL 字符串
bic银行标识码 (ISO 9362)
bcp47_language_tag语言标签 (BCP 47)
btc_addr比特币地址
btc_addr_bech32比特币 Bech32 地址 (segwit)
credit_card信用卡号
mongodbMongoDB ObjectID
mongodb_connection_stringMongoDB 连接字符串
cronCron 表达式
spicedbSpiceDb ObjectID/权限/类型
datetime日期时间
e164E.164 格式电话号码
ein美国雇主识别号
email电子邮件地址
eth_addr以太坊地址
hexadecimal十六进制字符串
hexcolor十六进制颜色值
hslHSL 颜色值
hslaHSLA 颜色值
htmlHTML 标签
html_encodedHTML 编码字符串
isbn国际标准书号
isbn10国际标准书号 10
isbn13国际标准书号 13
issn国际标准期刊号
iso3166_1_alpha2双字母国家代码 (ISO 3166-1 alpha-2)
iso3166_1_alpha3三字母国家代码 (ISO 3166-1 alpha-3)
iso3166_1_alpha_numeric数字国家代码 (ISO 3166-1 numeric)
iso3166_2国家行政区划代码 (ISO 3166-2)
iso4217货币代码 (ISO 4217)
jsonJSON 字符串
jwtJSON Web Token
latitude纬度
longitude经度
luhn_checksumLuhn 算法校验和
postcode_iso3166_alpha2邮政编码
postcode_iso3166_alpha2_field邮政编码字段
rgbRGB 颜色值
rgbaRGBA 颜色值
ssn社会安全号码
timezone时区
uuid通用唯一标识符
uuid3UUID v3
uuid3_rfc4122UUID v3 (RFC4122)
uuid4UUID v4
uuid4_rfc4122UUID v4 (RFC4122)
uuid5UUID v5
uuid5_rfc4122UUID v5 (RFC4122)
uuid_rfc4122UUID (RFC4122)
md4MD4 哈希
md5MD5 哈希
sha256SHA256 哈希
sha384SHA384 哈希
sha512SHA512 哈希
ripemd128RIPEMD-128 哈希
ripemd128RIPEMD-160 哈希
tiger128TIGER128 哈希
tiger160TIGER160 哈希
tiger192TIGER192 哈希
semver语义化版本 2.0.0
ulid通用唯一字典排序标识符
cve通用漏洞披露标识符

比较验证

标签描述
eq等于
eq_ignore_case等于(忽略大小写)
gt大于
gte大于等于
lt小于
lte小于等于
ne不等于
ne_ignore_case不等于(忽略大小写)

其他验证

标签描述
dir存在的目录
dirpath目录路径
file存在的文件
filepath文件路径
image图像文件
isdefault是默认值
len长度
max最大值
min最小值
oneof属于指定值之一
required必填字段
required_if条件必填
required_unless除非条件否则必填
required_with关联字段存在时必填
required_with_all所有关联字段存在时必填
required_without关联字段不存在时必填
required_without_all所有关联字段不存在时必填
excluded_if条件排除
excluded_unless除非条件否则排除
excluded_with关联字段存在时排除
excluded_with_all所有关联字段存在时排除
excluded_without关联字段不存在时排除
excluded_without_all所有关联字段不存在时排除
unique唯一值
validateFn验证方法不返回错误

别名
标签描述
iscolorhexcolor
country_codeiso3166_1_alpha2

七、性能基准

测试环境:MacBook Pro Max M3
go version go1.23.3 darwin/arm64
goos: darwin
goarch: arm64
cpu: Apple M3 Max
pkg: github.com/go-playground/validator/v10
BenchmarkFieldSuccess-16                                                42461943                27.88 ns/op            0 B/op          0 allocs/op
BenchmarkFieldSuccessParallel-16                                        486632887                2.289 ns/op           0 B/op          0 allocs/op
BenchmarkFieldFailure-16                                                 9566167               121.3 ns/op           200 B/op          4 allocs/op
BenchmarkFieldFailureParallel-16                                        17551471                83.68 ns/op          200 B/op          4 allocs/op
BenchmarkFieldArrayDiveSuccess-16                                        7602306               155.6 ns/op            97 B/op          5 allocs/op
BenchmarkFieldArrayDiveSuccessParallel-16                               20664610                59.80 ns/op           97 B/op          5 allocs/op
BenchmarkFieldArrayDiveFailure-16                                        4659756               252.9 ns/op           301 B/op         10 allocs/op
BenchmarkFieldArrayDiveFailureParallel-16                                8010116               152.9 ns/op           301 B/op         10 allocs/op
BenchmarkFieldMapDiveSuccess-16                                          2834575               421.2 ns/op           288 B/op         14 allocs/op
BenchmarkFieldMapDiveSuccessParallel-16                                  7179700               171.8 ns/op           288 B/op         14 allocs/op
BenchmarkFieldMapDiveFailure-16                                          3081728               384.4 ns/op           376 B/op         13 allocs/op
BenchmarkFieldMapDiveFailureParallel-16                                  6058137               204.0 ns/op           377 B/op         13 allocs/op
BenchmarkFieldMapDiveWithKeysSuccess-16                                  2544975               464.8 ns/op           288 B/op         14 allocs/op
BenchmarkFieldMapDiveWithKeysSuccessParallel-16                          6661954               181.4 ns/op           288 B/op         14 allocs/op
BenchmarkFieldMapDiveWithKeysFailure-16                                  2435484               490.7 ns/op           553 B/op         16 allocs/op
BenchmarkFieldMapDiveWithKeysFailureParallel-16                          4249617               282.0 ns/op           554 B/op         16 allocs/op
BenchmarkFieldCustomTypeSuccess-16                                      14943525                77.35 ns/op           32 B/op          2 allocs/op
BenchmarkFieldCustomTypeSuccessParallel-16                              64051954                20.61 ns/op           32 B/op          2 allocs/op
BenchmarkFieldCustomTypeFailure-16                                      10721384               107.1 ns/op           184 B/op          3 allocs/op
BenchmarkFieldCustomTypeFailureParallel-16                              18714495                69.77 ns/op          184 B/op          3 allocs/op
BenchmarkFieldOrTagSuccess-16                                            4063124               294.3 ns/op            16 B/op          1 allocs/op
BenchmarkFieldOrTagSuccessParallel-16                                   31903756                41.22 ns/op           18 B/op          1 allocs/op
BenchmarkFieldOrTagFailure-16                                            7748558               146.8 ns/op           216 B/op          5 allocs/op
BenchmarkFieldOrTagFailureParallel-16                                   13139854                92.05 ns/op          216 B/op          5 allocs/op
BenchmarkStructLevelValidationSuccess-16                                16808389                70.25 ns/op           16 B/op          1 allocs/op
BenchmarkStructLevelValidationSuccessParallel-16                        90686955                14.47 ns/op           16 B/op          1 allocs/op
BenchmarkStructLevelValidationFailure-16                                 5818791               200.2 ns/op           264 B/op          7 allocs/op
BenchmarkStructLevelValidationFailureParallel-16                        11115874               107.5 ns/op           264 B/op          7 allocs/op
BenchmarkStructSimpleCustomTypeSuccess-16                                7764956               151.9 ns/op            32 B/op          2 allocs/op
BenchmarkStructSimpleCustomTypeSuccessParallel-16                       52316265                30.37 ns/op           32 B/op          2 allocs/op
BenchmarkStructSimpleCustomTypeFailure-16                                4195429               277.2 ns/op           416 B/op          9 allocs/op
BenchmarkStructSimpleCustomTypeFailureParallel-16                        7305661               164.6 ns/op           432 B/op         10 allocs/op
BenchmarkStructFilteredSuccess-16                                        6312625               186.1 ns/op           216 B/op          5 allocs/op
BenchmarkStructFilteredSuccessParallel-16                               13684459                93.42 ns/op          216 B/op          5 allocs/op
BenchmarkStructFilteredFailure-16                                        6751482               171.2 ns/op           216 B/op          5 allocs/op
BenchmarkStructFilteredFailureParallel-16                               14146070                86.93 ns/op          216 B/op          5 allocs/op
BenchmarkStructPartialSuccess-16                                         6544448               177.3 ns/op           224 B/op          4 allocs/op
BenchmarkStructPartialSuccessParallel-16                                13951946                88.73 ns/op          224 B/op          4 allocs/op
BenchmarkStructPartialFailure-16                                         4075833               287.5 ns/op           440 B/op          9 allocs/op
BenchmarkStructPartialFailureParallel-16                                 7490805               161.3 ns/op           440 B/op          9 allocs/op
BenchmarkStructExceptSuccess-16                                          4107187               281.4 ns/op           424 B/op          8 allocs/op
BenchmarkStructExceptSuccessParallel-16                                 15979173                80.86 ns/op          208 B/op          3 allocs/op
BenchmarkStructExceptFailure-16                                          4434372               264.3 ns/op           424 B/op          8 allocs/op
BenchmarkStructExceptFailureParallel-16                                  808136
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值