包验证器的详细指南

286 阅读11分钟

包验证器

Join the chat at https://gitter.im/go-playground/validatorProject statusBuild StatusCoverage StatusGo Report CardGoDocLicense

包验证器实现了基于标签的结构和单个字段的值验证。

它有以下独特的功能:

  • 通过使用验证标签或自定义验证器进行跨字段和跨结构验证。
  • 切片、数组和地图潜入,允许对一个多维字段的任何或所有层次进行验证。
  • 能够潜入地图的键和值中进行验证。
  • 通过在验证前确定它的基本类型来处理类型接口。
  • 处理自定义字段类型,如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_addrUnix域套接字端点地址
uriURI字符串
网址URL字符串
url_encoded编码的URL
urn_rfc2141Urn RFC 2141字符串

字符串。

标签描述
阿尔法仅限阿尔法
alphanum字母数字
字母数字Unicode字母数字Unicode
αunicode阿尔法统一码
asciiASCII
boolean布尔型
包含包含
包含任何包含任何
包含符文包含符文
结束不与不包含的结束
结束与结束与
不包括不包括
不包括所有不包括所有
不包括鲁恩排除符文
小写小写字母
multibyte多字节字符
数字未记录在doc.go中
数字数值
printascii可打印的ASCII码
startsnotwith不以任何方式开始
开始与开始于
大写字母大写字母

格式:

标签描述
base64Base64字符串
编码Base64URL字符串
bic商业识别码(ISO 9362)。
bcp47_language_tag语言标签(BCP47)。
btc_addr比特币地址
btc_addr_bech32比特币Bech32地址 (segwit)
credit_card信用卡号码
日期时间日期时间
e164e164格式的电话号码
emailE-mail字符串
eth_addr以太坊地址
十六进制十六进制字符串
十六色十六进制颜色字符串
hslHSL字符串
橙色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)
jsonJSON
jwtJSON网络令牌(JWT)。
纬度纬度
经度经度
postcode_iso3166_alpha2邮政编码
邮政编码_iso3166_alpha2_field邮政编码
rgbRGB字符串
rgbaRGBA字符串
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
md4MD4哈希值
md5MD5哈希值
sha256SHA256哈希值
沙哈384SHA384哈希值
SHA512SHA512哈希值
RIPEMD128RIPEMD-128哈希值
RIPEMD128RIPEMD-160哈希值
tiger128TIGER128 哈希值
tiger160TIGER160 哈希值
老虎192TIGER192 哈希
SemverSemantic Versioning 2.0.0
ulid普遍独特的、可按词汇排序的标识符ULID

比较:

标签描述
eq等于
gt大于
gte大于或等于
lt小于
lte小于或等于
ne不等于

其他:

标签描述
排放目录
文件文件路径
isdefault是默认的
len长度
最大最大
min最小值
其中其中一个
所需需要
必要的_如果必需的,如果
必需的_无必需的,除非
需要必须有
必需包含所有全部为必填
需要_不需要必需的,没有
不含所有必需的,没有全部
excluded_if不包括,如果
不包括排除在外,除非
excluded_with排除与
excluded_with_all全部排除
除外_不包括不包括在内
排除在外_不包括所有不包括所有
唯一的独特的

别名:

标签描述
是色肤色rgbrgbahslhsla
国家代码iso3166_1_alpha2iso3166_1_alpha3iso3166_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

补充性软件

以下是使用这个库的补充软件列表,无论是在验证前还是验证后:

  • form- 将url.Values解码为Go值,将Go值编码为url.Values。支持双数组和全地图。
  • mold- 一个通用库,帮助修改或设置数据结构和其他对象中的数据。

如何贡献

发出拉动请求...

许可证

以MIT许可证发布,更多细节请见代码中的许可证文件。

维护者

这个项目已经发展到足够大的规模,需要一个以上的人去适当地支持社区。如果你有兴趣成为维护者,请联系我github.com/deankarn