包验证器基于标记为结构体和单个字段实现值验证。
它有以下独特的特性:
- 使用验证标签或自定义验证器进行字段和结构体验证
- 切片、数组和地图跳水,允许对多维字段的任何或所有级别进行验证。
- 能够潜入映射键和值进行验证
- 通过在验证之前确定类型接口的基础类型来处理类型接口。
- 处理自定义字段类型,如sql驱动程序Valuer参见Valuer
- 别名验证标记,它允许将多个验证映射到单个标记,以便更容易定义结构上的验证
- 提取自定义字段名,例如,可以指定提取JSON名,同时验证,并使其在结果FieldError中可用
- 可定制的i18n识别错误消息。
- 缺省的gin web框架验证器;在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(如果必要,大部分时间它不是)类型cast它的类型ValidationErrors,像这样:
err := validate.Struct(mystruct)validationErrors := err.(validator.ValidationErrors)
使用和文档
请查看https://godoc.org/github.com/go-playground/validator了解详细的使用文档。
例子
- Simple
- Custom Field Types
- Struct Level
- Translations & Custom Errors
- Gin upgrade and/or override validator
- wash - an example application putting it all together
常用的验证
Fields:
| Tag | Description |
|---|---|
| eqcsfield | Field Equals Another Field (relative) |
| eqfield | Field Equals Another Field |
| fieldcontains | NOT DOCUMENTED IN doc.go |
| fieldexcludes | NOT DOCUMENTED IN doc.go |
| gtcsfield | Field Greater Than Another Relative Field |
| gtecsfield | Field Greater Than or Equal To Another Relative Field |
| gtefield | Field Greater Than or Equal To Another Field |
| gtfield | Field Greater Than Another Field |
| ltcsfield | Less Than Another Relative Field |
| ltecsfield | Less Than or Equal To Another Relative Field |
| ltefield | Less Than or Equal To Another Field |
| ltfield | Less Than Another Field |
| necsfield | Field Does Not Equal Another Field (relative) |
| nefield | Field Does Not Equal Another Field |
Network:
| Tag | Description |
|---|---|
| cidr | Classless Inter-Domain Routing CIDR |
| cidrv4 | Classless Inter-Domain Routing CIDRv4 |
| cidrv6 | Classless Inter-Domain Routing CIDRv6 |
| datauri | Data URL |
| fqdn | Full Qualified Domain Name (FQDN) |
| hostname | Hostname RFC 952 |
| hostname_port | HostPort |
| hostname_rfc1123 | Hostname RFC 1123 |
| ip | Internet Protocol Address IP |
| ip4_addr | Internet Protocol Address IPv4 |
| ip6_addr | Internet Protocol Address IPv6 |
| ip_addr | Internet Protocol Address IP |
| ipv4 | Internet Protocol Address IPv4 |
| ipv6 | Internet Protocol Address IPv6 |
| mac | Media Access Control Address MAC |
| tcp4_addr | Transmission Control Protocol Address TCPv4 |
| tcp6_addr | Transmission Control Protocol Address TCPv6 |
| tcp_addr | Transmission Control Protocol Address TCP |
| udp4_addr | User Datagram Protocol Address UDPv4 |
| udp6_addr | User Datagram Protocol Address UDPv6 |
| udp_addr | User Datagram Protocol Address UDP |
| unix_addr | Unix domain socket end point Address |
| uri | URI String |
| url | URL String |
| url_encoded | URL Encoded |
| urn_rfc2141 | Urn RFC 2141 String |
Strings:
| Tag | Description |
|---|---|
| alpha | Alpha Only |
| alphanum | Alphanumeric |
| alphanumunicode | Alphanumeric Unicode |
| alphaunicode | Alpha Unicode |
| ascii | ASCII |
| contains | Contains |
| containsany | Contains Any |
| containsrune | Contains Rune |
| endswith | Ends With |
| lowercase | Lowercase |
| multibyte | Multi-Byte Characters |
| number | NOT DOCUMENTED IN doc.go |
| numeric | Numeric |
| printascii | Printable ASCII |
| startswith | Starts With |
| uppercase | Uppercase |
Format:
| Tag | Description |
|---|---|
| base64 | Base64 String |
| base64url | Base64URL String |
| btc_addr | Bitcoin Address |
| btc_addr_bech32 | Bitcoin Bech32 Address (segwit) |
| datetime | Datetime |
| e164 | e164 formatted phone number |
| E-mail String | |
| eth_addr | Ethereum Address |
| hexadecimal | Hexadecimal String |
| hexcolor | Hexcolor String |
| hsl | HSL String |
| hsla | HSLA String |
| html | HTML Tags |
| html_encoded | HTML Encoded |
| isbn | International Standard Book Number |
| isbn10 | International Standard Book Number 10 |
| isbn13 | International Standard Book Number 13 |
| json | JSON |
| latitude | Latitude |
| longitude | Longitude |
| rgb | RGB String |
| rgba | RGBA String |
| ssn | Social Security Number SSN |
| uuid | Universally Unique Identifier UUID |
| uuid3 | Universally Unique Identifier UUID v3 |
| uuid3_rfc4122 | Universally Unique Identifier UUID v3 RFC4122 |
| uuid4 | Universally Unique Identifier UUID v4 |
| uuid4_rfc4122 | Universally Unique Identifier UUID v4 RFC4122 |
| uuid5 | Universally Unique Identifier UUID v5 |
| uuid5_rfc4122 | Universally Unique Identifier UUID v5 RFC4122 |
| uuid_rfc4122 | Universally Unique Identifier UUID RFC4122 |
Comparisons:
| Tag | Description |
|---|---|
| eq | Equals |
| gt | Greater than |
| gte | Greater than or equal |
| lt | Less Than |
| lte | Less Than or Equal |
| ne | Not Equal |
Other:
| Tag | Description |
|---|---|
| dir | Directory |
| endswith | Ends With |
| excludes | Excludes |
| excludesall | Excludes All |
| excludesrune | Excludes Rune |
| file | File path |
| isdefault | Is Default |
| len | Length |
| max | Maximum |
| min | Minimum |
| oneof | One Of |
| required | Required |
| required_if | Required If |
| required_unless | Required Unless |
| required_with | Required With |
| required_with_all | Required With All |
| required_without | Required Without |
| required_without_all | Required Without All |
| excluded_with | Excluded With |
| excluded_with_all | Excluded With All |
| excluded_without | Excluded Without |
| excluded_without_all | Excluded Without All |
| unique | Unique |
Benchmarks
运行在MacBook Pro(15英寸,2017)go版本go1.10.2 darwin/amd64
goos: darwingoarch: amd64pkg: github.com/go-playground/validatorBenchmarkFieldSuccess-8 20000000 83.6 ns/op 0 B/op 0 allocs/opBenchmarkFieldSuccessParallel-8 50000000 26.8 ns/op 0 B/op 0 allocs/opBenchmarkFieldFailure-8 5000000 291 ns/op 208 B/op 4 allocs/opBenchmarkFieldFailureParallel-8 20000000 107 ns/op 208 B/op 4 allocs/opBenchmarkFieldArrayDiveSuccess-8 2000000 623 ns/op 201 B/op 11 allocs/opBenchmarkFieldArrayDiveSuccessParallel-8 10000000 237 ns/op 201 B/op 11 allocs/opBenchmarkFieldArrayDiveFailure-8 2000000 859 ns/op 412 B/op 16 allocs/opBenchmarkFieldArrayDiveFailureParallel-8 5000000 335 ns/op 413 B/op 16 allocs/opBenchmarkFieldMapDiveSuccess-8 1000000 1292 ns/op 432 B/op 18 allocs/opBenchmarkFieldMapDiveSuccessParallel-8 3000000 467 ns/op 432 B/op 18 allocs/opBenchmarkFieldMapDiveFailure-8 1000000 1082 ns/op 512 B/op 16 allocs/opBenchmarkFieldMapDiveFailureParallel-8 5000000 425 ns/op 512 B/op 16 allocs/opBenchmarkFieldMapDiveWithKeysSuccess-8 1000000 1539 ns/op 480 B/op 21 allocs/opBenchmarkFieldMapDiveWithKeysSuccessParallel-8 3000000 613 ns/op 480 B/op 21 allocs/opBenchmarkFieldMapDiveWithKeysFailure-8 1000000 1413 ns/op 721 B/op 21 allocs/opBenchmarkFieldMapDiveWithKeysFailureParallel-8 3000000 575 ns/op 721 B/op 21 allocs/opBenchmarkFieldCustomTypeSuccess-8 10000000 216 ns/op 32 B/op 2 allocs/opBenchmarkFieldCustomTypeSuccessParallel-8 20000000 82.2 ns/op 32 B/op 2 allocs/opBenchmarkFieldCustomTypeFailure-8 5000000 274 ns/op 208 B/op 4 allocs/opBenchmarkFieldCustomTypeFailureParallel-8 20000000 116 ns/op 208 B/op 4 allocs/opBenchmarkFieldOrTagSuccess-8 2000000 740 ns/op 16 B/op 1 allocs/opBenchmarkFieldOrTagSuccessParallel-8 3000000 474 ns/op 16 B/op 1 allocs/opBenchmarkFieldOrTagFailure-8 3000000 471 ns/op 224 B/op 5 allocs/opBenchmarkFieldOrTagFailureParallel-8 3000000 414 ns/op 224 B/op 5 allocs/opBenchmarkStructLevelValidationSuccess-8 10000000 213 ns/op 32 B/op 2 allocs/opBenchmarkStructLevelValidationSuccessParallel-8 20000000 91.8 ns/op 32 B/op 2 allocs/opBenchmarkStructLevelValidationFailure-8 3000000 473 ns/op 304 B/op 8 allocs/opBenchmarkStructLevelValidationFailureParallel-8 10000000 234 ns/op 304 B/op 8 allocs/opBenchmarkStructSimpleCustomTypeSuccess-8 5000000 385 ns/op 32 B/op 2 allocs/opBenchmarkStructSimpleCustomTypeSuccessParallel-8 10000000 161 ns/op 32 B/op 2 allocs/opBenchmarkStructSimpleCustomTypeFailure-8 2000000 640 ns/op 424 B/op 9 allocs/opBenchmarkStructSimpleCustomTypeFailureParallel-8 5000000 318 ns/op 440 B/op 10 allocs/opBenchmarkStructFilteredSuccess-8 2000000 597 ns/op 288 B/op 9 allocs/opBenchmarkStructFilteredSuccessParallel-8 10000000 266 ns/op 288 B/op 9 allocs/opBenchmarkStructFilteredFailure-8 3000000 454 ns/op 256 B/op 7 allocs/opBenchmarkStructFilteredFailureParallel-8 10000000 214 ns/op 256 B/op 7 allocs/opBenchmarkStructPartialSuccess-8 3000000 502 ns/op 256 B/op 6 allocs/opBenchmarkStructPartialSuccessParallel-8 10000000 225 ns/op 256 B/op 6 allocs/opBenchmarkStructPartialFailure-8 2000000 702 ns/op 480 B/op 11 allocs/opBenchmarkStructPartialFailureParallel-8 5000000 329 ns/op 480 B/op 11 allocs/opBenchmarkStructExceptSuccess-8 2000000 793 ns/op 496 B/op 12 allocs/opBenchmarkStructExceptSuccessParallel-8 10000000 193 ns/op 240 B/op 5 allocs/opBenchmarkStructExceptFailure-8 2000000 639 ns/op 464 B/op 10 allocs/opBenchmarkStructExceptFailureParallel-8 5000000 300 ns/op 464 B/op 10 allocs/opBenchmarkStructSimpleCrossFieldSuccess-8 3000000 417 ns/op 72 B/op 3 allocs/opBenchmarkStructSimpleCrossFieldSuccessParallel-8 10000000 163 ns/op 72 B/op 3 allocs/opBenchmarkStructSimpleCrossFieldFailure-8 2000000 645 ns/op 304 B/op 8 allocs/opBenchmarkStructSimpleCrossFieldFailureParallel-8 5000000 285 ns/op 304 B/op 8 allocs/opBenchmarkStructSimpleCrossStructCrossFieldSuccess-8 3000000 588 ns/op 80 B/op 4 allocs/opBenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 10000000 221 ns/op 80 B/op 4 allocs/opBenchmarkStructSimpleCrossStructCrossFieldFailure-8 2000000 868 ns/op 320 B/op 9 allocs/opBenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 5000000 337 ns/op 320 B/op 9 allocs/opBenchmarkStructSimpleSuccess-8 5000000 260 ns/op 0 B/op 0 allocs/opBenchmarkStructSimpleSuccessParallel-8 20000000 90.6 ns/op 0 B/op 0 allocs/opBenchmarkStructSimpleFailure-8 2000000 619 ns/op 424 B/op 9 allocs/opBenchmarkStructSimpleFailureParallel-8 5000000 296 ns/op 424 B/op 9 allocs/opBenchmarkStructComplexSuccess-8 1000000 1454 ns/op 128 B/op 8 allocs/opBenchmarkStructComplexSuccessParallel-8 3000000 579 ns/op 128 B/op 8 allocs/opBenchmarkStructComplexFailure-8 300000 4140 ns/op 3041 B/op 53 allocs/opBenchmarkStructComplexFailureParallel-8 1000000 2127 ns/op 3041 B/op 53 allocs/opBenchmarkOneof-8 10000000 140 ns/op 0 B/op 0 allocs/opBenchmarkOneofParallel-8 20000000 70.1 ns/op 0 B/op 0 allocs/op
配套软件
下面是在验证前或验证后使用此库进行补充的软件列表。
