包验证器
包验证器实现了基于标签的结构和单个字段的值验证。
它有以下独特的功能:
- 通过使用验证标签或自定义验证器进行跨字段和跨结构验证。
- 切片、数组和地图潜入,允许对一个多维字段的任何或所有层次进行验证。
- 能够潜入地图的键和值中进行验证。
- 通过在验证前确定它的基本类型来处理类型接口。
- 处理自定义字段类型,如sql驱动Valuer见Valuer
- 别名验证标签,允许将几个验证映射到一个标签上,以方便定义结构上的验证。
- 提取自定义定义的字段名,例如,可以指定在验证时提取JSON名称,并在产生的FieldError中提供该名称。
- 可定制的i18n感知错误信息。
- ginweb框架的默认验证器;在gin中从v8升级到v9请看这里
安装
使用go get。
go get github.com/go-playground/validator/v10
然后将验证器包导入你自己的代码中。
import "github.com/go-playground/validator/v10"
错误返回值
验证函数返回类型错误
它们返回类型错误是为了避免下面讨论的问题,即err总是 != nil。
Validator只对错误的验证输入返回InvalidValidationError,对类型错误返回nil或ValidationErrors;所以,在你的代码中,你需要做的是检查返回的错误是否为nil,如果不是,则检查错误是否为InvalidValidationError(如果需要,大多数情况下不是),像这样把它类型化为ValidationErrors。
err := validate.Struct(mystruct)
validationErrors := err.(validator.ValidationErrors)
使用方法和文档
请参阅pkg.go.dev/github.com/…,了解详细的使用说明。
例子:
烘烤的验证方法
字段:
| 标签 | 描述 |
|---|---|
| eqcsfield | 字段等同于另一个字段(相对)。 |
| 符号 | 字段等同于另一个字段 |
| 字段包含 | 未记录在doc.go中 |
| 字段不包括 | 未记录在doc.go中 |
| gtcsfield | 大于另一相对字段的字段 |
| gtecsfield | 大于或等于另一个相对字段的字段 |
| gtefield | 大于或等于另一个字段的字段 |
| 场地 | 大于另一个字段的字段 |
| ltcsfield | 小于另一个相对字段 |
| 小于或等于另一个相对字段 | 小于或等于另一个相对字段 |
| ltefield | 小于或等于另一个字段 |
| 梯田 | 小于另一个字段 |
| 小于或等于另一字段 | 字段不等于另一字段(相对) |
| 场地 | 字段不等于另一字段 |
网络。
| 标签 | 描述 |
|---|---|
| cidr | 无类域间路由CIDR |
| cidrv4 | 无类域间路由CIDRv4 |
| cidrv6 | 无类域间路由CIDRv6 |
| 数据 | 数据URL |
| fqdn | 全限定域名(FQDN)。 |
| 主机名 | 主机名RFC 952 |
| 主机名_端口 | 主机端口 |
| 主机名_rfc1123 | 主机名RFC1123 |
| ip | 互联网协议地址 IP |
| ip4_addr | 互联网协议地址IPv4 |
| ip6_addr | 互联网协议地址IPv6 |
| ip_addr | 互联网协议地址IP |
| ipv4 | 互联网协议地址IPv4 |
| ipv6 | 互联网协议地址IPv6 |
| mac | 媒体访问控制地址MAC |
| tcp4_addr | 传输控制协议地址 TCPv4 |
| tcp6_addr | 传输控制协议地址 TCPv6 |
| tcp_addr | 传输控制协议地址 TCP |
| udp4_addr | 用户数据报协议地址UDPv4 |
| udp6_addr | 用户数据报协议地址 UDPv6 |
| udp_addr | 用户数据报协议地址UDP |
| unix_addr | Unix域套接字端点地址 |
| uri | URI字符串 |
| 网址 | URL字符串 |
| url_encoded | 编码的URL |
| urn_rfc2141 | Urn RFC 2141字符串 |
字符串。
| 标签 | 描述 |
|---|---|
| 阿尔法 | 仅限阿尔法 |
| alphanum | 字母数字 |
| 字母数字Unicode | 字母数字Unicode |
| αunicode | 阿尔法统一码 |
| ascii | ASCII |
| boolean | 布尔型 |
| 包含 | 包含 |
| 包含任何 | 包含任何 |
| 包含符文 | 包含符文 |
| 结束不与 | 不包含的结束 |
| 结束与 | 结束与 |
| 不包括 | 不包括 |
| 不包括所有 | 不包括所有 |
| 不包括鲁恩 | 排除符文 |
| 小写 | 小写字母 |
| multibyte | 多字节字符 |
| 数字 | 未记录在doc.go中 |
| 数字 | 数值 |
| printascii | 可打印的ASCII码 |
| startsnotwith | 不以任何方式开始 |
| 开始与 | 开始于 |
| 大写字母 | 大写字母 |
格式:
| 标签 | 描述 |
|---|---|
| base64 | Base64字符串 |
| 编码 | Base64URL字符串 |
| bic | 商业识别码(ISO 9362)。 |
| bcp47_language_tag | 语言标签(BCP47)。 |
| btc_addr | 比特币地址 |
| btc_addr_bech32 | 比特币Bech32地址 (segwit) |
| credit_card | 信用卡号码 |
| 日期时间 | 日期时间 |
| e164 | e164格式的电话号码 |
| E-mail字符串 | |
| eth_addr | 以太坊地址 |
| 十六进制 | 十六进制字符串 |
| 十六色 | 十六进制颜色字符串 |
| hsl | HSL字符串 |
| 橙色 | HSLA字符串 |
| 语气词 | HTML标签 |
| html_encoded | 编码的HTML |
| 国际标准书号(isbn | 国际标准书号 |
| isbn10 | 国际标准书号10 |
| isbn13 | 国际标准书号13 |
| iso3166_1_alpha2 | 双字母国家代码(ISO 3166-1 alpha-2) |
| ISO3166_1_alpha3 | 三个字母的国家代码(ISO 3166-1 alpha-3) |
| iso3166_1_alpha_numeric | 数字型国家代码(ISO 3166-1数字型)。 |
| iso3166_2 | 国家细分代码(ISO 3166-2) |
| iso4217 | 货币代码(ISO 4217) |
| json | JSON |
| jwt | JSON网络令牌(JWT)。 |
| 纬度 | 纬度 |
| 经度 | 经度 |
| postcode_iso3166_alpha2 | 邮政编码 |
| 邮政编码_iso3166_alpha2_field | 邮政编码 |
| rgb | RGB字符串 |
| rgba | RGBA字符串 |
| ssn | 社会安全号码SSN |
| 时区 | 时区 |
| uuid | 通用唯一标识符UUID |
| uuid3 | 通用唯一标识符UUID v3 |
| uuid3_rfc4122 | 通用唯一标识符UUID v3 RFC4122 |
| uuid4 | 通用唯一识别码UUID v4 |
| uuid4_rfc4122 | 通用唯一标识符UUID v4 RFC4122 |
| uuid5 | 通用唯一标识符UUID v5 |
| uuid5_rfc4122 | 通用唯一标识符UUID v5 RFC4122 |
| uuid_rfc4122 | 通用唯一标识符UUID RFC4122 |
| md4 | MD4哈希值 |
| md5 | MD5哈希值 |
| sha256 | SHA256哈希值 |
| 沙哈384 | SHA384哈希值 |
| SHA512 | SHA512哈希值 |
| RIPEMD128 | RIPEMD-128哈希值 |
| RIPEMD128 | RIPEMD-160哈希值 |
| tiger128 | TIGER128 哈希值 |
| tiger160 | TIGER160 哈希值 |
| 老虎192 | TIGER192 哈希 |
| Semver | Semantic Versioning 2.0.0 |
| ulid | 普遍独特的、可按词汇排序的标识符ULID |
比较:
| 标签 | 描述 |
|---|---|
| eq | 等于 |
| gt | 大于 |
| gte | 大于或等于 |
| lt | 小于 |
| lte | 小于或等于 |
| ne | 不等于 |
其他:
| 标签 | 描述 |
|---|---|
| 排放 | 目录 |
| 文件 | 文件路径 |
| isdefault | 是默认的 |
| len | 长度 |
| 最大 | 最大 |
| min | 最小值 |
| 其中 | 其中一个 |
| 所需 | 需要 |
| 必要的_如果 | 必需的,如果 |
| 必需的_无 | 必需的,除非 |
| 需要 | 必须有 |
| 必需包含所有 | 全部为必填 |
| 需要_不需要 | 必需的,没有 |
| 不含所有 | 必需的,没有全部 |
| excluded_if | 不包括,如果 |
| 不包括 | 排除在外,除非 |
| excluded_with | 排除与 |
| excluded_with_all | 全部排除 |
| 除外_不包括 | 不包括在内 |
| 排除在外_不包括所有 | 不包括所有 |
| 唯一的 | 独特的 |
别名:
| 标签 | 描述 | ||||
|---|---|---|---|---|---|
| 是色 | 肤色 | rgb | rgba | hsl | hsla |
| 国家代码 | iso3166_1_alpha2 | iso3166_1_alpha3 | iso3166_1_alpha_numeric |
基准测试
在MacBook Pro(15英寸,2017年)go1.10.2 darwin/amd64版本上运行
goos: darwin
goarch: amd64
pkg: github.com/go-playground/validator
BenchmarkFieldSuccess-8 20000000 83.6 ns/op 0 B/op 0 allocs/op
BenchmarkFieldSuccessParallel-8 50000000 26.8 ns/op 0 B/op 0 allocs/op
BenchmarkFieldFailure-8 5000000 291 ns/op 208 B/op 4 allocs/op
BenchmarkFieldFailureParallel-8 20000000 107 ns/op 208 B/op 4 allocs/op
BenchmarkFieldArrayDiveSuccess-8 2000000 623 ns/op 201 B/op 11 allocs/op
BenchmarkFieldArrayDiveSuccessParallel-8 10000000 237 ns/op 201 B/op 11 allocs/op
BenchmarkFieldArrayDiveFailure-8 2000000 859 ns/op 412 B/op 16 allocs/op
BenchmarkFieldArrayDiveFailureParallel-8 5000000 335 ns/op 413 B/op 16 allocs/op
BenchmarkFieldMapDiveSuccess-8 1000000 1292 ns/op 432 B/op 18 allocs/op
BenchmarkFieldMapDiveSuccessParallel-8 3000000 467 ns/op 432 B/op 18 allocs/op
BenchmarkFieldMapDiveFailure-8 1000000 1082 ns/op 512 B/op 16 allocs/op
BenchmarkFieldMapDiveFailureParallel-8 5000000 425 ns/op 512 B/op 16 allocs/op
BenchmarkFieldMapDiveWithKeysSuccess-8 1000000 1539 ns/op 480 B/op 21 allocs/op
BenchmarkFieldMapDiveWithKeysSuccessParallel-8 3000000 613 ns/op 480 B/op 21 allocs/op
BenchmarkFieldMapDiveWithKeysFailure-8 1000000 1413 ns/op 721 B/op 21 allocs/op
BenchmarkFieldMapDiveWithKeysFailureParallel-8 3000000 575 ns/op 721 B/op 21 allocs/op
BenchmarkFieldCustomTypeSuccess-8 10000000 216 ns/op 32 B/op 2 allocs/op
BenchmarkFieldCustomTypeSuccessParallel-8 20000000 82.2 ns/op 32 B/op 2 allocs/op
BenchmarkFieldCustomTypeFailure-8 5000000 274 ns/op 208 B/op 4 allocs/op
BenchmarkFieldCustomTypeFailureParallel-8 20000000 116 ns/op 208 B/op 4 allocs/op
BenchmarkFieldOrTagSuccess-8 2000000 740 ns/op 16 B/op 1 allocs/op
BenchmarkFieldOrTagSuccessParallel-8 3000000 474 ns/op 16 B/op 1 allocs/op
BenchmarkFieldOrTagFailure-8 3000000 471 ns/op 224 B/op 5 allocs/op
BenchmarkFieldOrTagFailureParallel-8 3000000 414 ns/op 224 B/op 5 allocs/op
BenchmarkStructLevelValidationSuccess-8 10000000 213 ns/op 32 B/op 2 allocs/op
BenchmarkStructLevelValidationSuccessParallel-8 20000000 91.8 ns/op 32 B/op 2 allocs/op
BenchmarkStructLevelValidationFailure-8 3000000 473 ns/op 304 B/op 8 allocs/op
BenchmarkStructLevelValidationFailureParallel-8 10000000 234 ns/op 304 B/op 8 allocs/op
BenchmarkStructSimpleCustomTypeSuccess-8 5000000 385 ns/op 32 B/op 2 allocs/op
BenchmarkStructSimpleCustomTypeSuccessParallel-8 10000000 161 ns/op 32 B/op 2 allocs/op
BenchmarkStructSimpleCustomTypeFailure-8 2000000 640 ns/op 424 B/op 9 allocs/op
BenchmarkStructSimpleCustomTypeFailureParallel-8 5000000 318 ns/op 440 B/op 10 allocs/op
BenchmarkStructFilteredSuccess-8 2000000 597 ns/op 288 B/op 9 allocs/op
BenchmarkStructFilteredSuccessParallel-8 10000000 266 ns/op 288 B/op 9 allocs/op
BenchmarkStructFilteredFailure-8 3000000 454 ns/op 256 B/op 7 allocs/op
BenchmarkStructFilteredFailureParallel-8 10000000 214 ns/op 256 B/op 7 allocs/op
BenchmarkStructPartialSuccess-8 3000000 502 ns/op 256 B/op 6 allocs/op
BenchmarkStructPartialSuccessParallel-8 10000000 225 ns/op 256 B/op 6 allocs/op
BenchmarkStructPartialFailure-8 2000000 702 ns/op 480 B/op 11 allocs/op
BenchmarkStructPartialFailureParallel-8 5000000 329 ns/op 480 B/op 11 allocs/op
BenchmarkStructExceptSuccess-8 2000000 793 ns/op 496 B/op 12 allocs/op
BenchmarkStructExceptSuccessParallel-8 10000000 193 ns/op 240 B/op 5 allocs/op
BenchmarkStructExceptFailure-8 2000000 639 ns/op 464 B/op 10 allocs/op
BenchmarkStructExceptFailureParallel-8 5000000 300 ns/op 464 B/op 10 allocs/op
BenchmarkStructSimpleCrossFieldSuccess-8 3000000 417 ns/op 72 B/op 3 allocs/op
BenchmarkStructSimpleCrossFieldSuccessParallel-8 10000000 163 ns/op 72 B/op 3 allocs/op
BenchmarkStructSimpleCrossFieldFailure-8 2000000 645 ns/op 304 B/op 8 allocs/op
BenchmarkStructSimpleCrossFieldFailureParallel-8 5000000 285 ns/op 304 B/op 8 allocs/op
BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 3000000 588 ns/op 80 B/op 4 allocs/op
BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 10000000 221 ns/op 80 B/op 4 allocs/op
BenchmarkStructSimpleCrossStructCrossFieldFailure-8 2000000 868 ns/op 320 B/op 9 allocs/op
BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 5000000 337 ns/op 320 B/op 9 allocs/op
BenchmarkStructSimpleSuccess-8 5000000 260 ns/op 0 B/op 0 allocs/op
BenchmarkStructSimpleSuccessParallel-8 20000000 90.6 ns/op 0 B/op 0 allocs/op
BenchmarkStructSimpleFailure-8 2000000 619 ns/op 424 B/op 9 allocs/op
BenchmarkStructSimpleFailureParallel-8 5000000 296 ns/op 424 B/op 9 allocs/op
BenchmarkStructComplexSuccess-8 1000000 1454 ns/op 128 B/op 8 allocs/op
BenchmarkStructComplexSuccessParallel-8 3000000 579 ns/op 128 B/op 8 allocs/op
BenchmarkStructComplexFailure-8 300000 4140 ns/op 3041 B/op 53 allocs/op
BenchmarkStructComplexFailureParallel-8 1000000 2127 ns/op 3041 B/op 53 allocs/op
BenchmarkOneof-8 10000000 140 ns/op 0 B/op 0 allocs/op
BenchmarkOneofParallel-8 20000000 70.1 ns/op 0 B/op 0 allocs/op
补充性软件
以下是使用这个库的补充软件列表,无论是在验证前还是验证后:
如何贡献
发出拉动请求...
许可证
以MIT许可证发布,更多细节请见代码中的许可证文件。
维护者
这个项目已经发展到足够大的规模,需要一个以上的人去适当地支持社区。如果你有兴趣成为维护者,请联系我github.com/deankarn。
