包验证器基于标记为结构体和单个字段实现值验证。

它有以下独特的特性:

  • 使用验证标签或自定义验证器进行字段和结构体验证
  • 切片、数组和地图跳水,允许对多维字段的任何或所有级别进行验证。
  • 能够潜入映射键和值进行验证
  • 通过在验证之前确定类型接口的基础类型来处理类型接口。
  • 处理自定义字段类型,如sql驱动程序Valuer参见Valuer
  • 别名验证标记,它允许将多个验证映射到单个标记,以便更容易定义结构上的验证
  • 提取自定义字段名,例如,可以指定提取JSON名,同时验证,并使其在结果FieldError中可用
  • 可定制的i18n识别错误消息。
  • 缺省的gin web框架验证器;在gin中从v8升级到v9,请看这里


安装


使用 go get

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

然后将验证程序包导入到您自己的代码中。

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

错误返回值

验证函数返回类型错误
它们返回类型错误以避免下面讨论的问题,在这里err总是!= nil:

Validator只有InvalidValidationError用于错误的验证输入,nil或ValidationErrors作为类型错误;所以,在你的代码中,你所需要做的就是检查返回的错误是否为nil,如果它不是检查错误是否为InvalidValidationError(如果必要,大部分时间它不是)类型cast它的类型ValidationErrors,像这样:

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

使用和文档

请查看https://godoc.org/github.com/go-playground/validator了解详细的使用文档。

例子

常用的验证

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
email 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

  1. goos: darwin
  2. goarch: amd64
  3. pkg: github.com/go-playground/validator
  4. BenchmarkFieldSuccess-8 20000000 83.6 ns/op 0 B/op 0 allocs/op
  5. BenchmarkFieldSuccessParallel-8 50000000 26.8 ns/op 0 B/op 0 allocs/op
  6. BenchmarkFieldFailure-8 5000000 291 ns/op 208 B/op 4 allocs/op
  7. BenchmarkFieldFailureParallel-8 20000000 107 ns/op 208 B/op 4 allocs/op
  8. BenchmarkFieldArrayDiveSuccess-8 2000000 623 ns/op 201 B/op 11 allocs/op
  9. BenchmarkFieldArrayDiveSuccessParallel-8 10000000 237 ns/op 201 B/op 11 allocs/op
  10. BenchmarkFieldArrayDiveFailure-8 2000000 859 ns/op 412 B/op 16 allocs/op
  11. BenchmarkFieldArrayDiveFailureParallel-8 5000000 335 ns/op 413 B/op 16 allocs/op
  12. BenchmarkFieldMapDiveSuccess-8 1000000 1292 ns/op 432 B/op 18 allocs/op
  13. BenchmarkFieldMapDiveSuccessParallel-8 3000000 467 ns/op 432 B/op 18 allocs/op
  14. BenchmarkFieldMapDiveFailure-8 1000000 1082 ns/op 512 B/op 16 allocs/op
  15. BenchmarkFieldMapDiveFailureParallel-8 5000000 425 ns/op 512 B/op 16 allocs/op
  16. BenchmarkFieldMapDiveWithKeysSuccess-8 1000000 1539 ns/op 480 B/op 21 allocs/op
  17. BenchmarkFieldMapDiveWithKeysSuccessParallel-8 3000000 613 ns/op 480 B/op 21 allocs/op
  18. BenchmarkFieldMapDiveWithKeysFailure-8 1000000 1413 ns/op 721 B/op 21 allocs/op
  19. BenchmarkFieldMapDiveWithKeysFailureParallel-8 3000000 575 ns/op 721 B/op 21 allocs/op
  20. BenchmarkFieldCustomTypeSuccess-8 10000000 216 ns/op 32 B/op 2 allocs/op
  21. BenchmarkFieldCustomTypeSuccessParallel-8 20000000 82.2 ns/op 32 B/op 2 allocs/op
  22. BenchmarkFieldCustomTypeFailure-8 5000000 274 ns/op 208 B/op 4 allocs/op
  23. BenchmarkFieldCustomTypeFailureParallel-8 20000000 116 ns/op 208 B/op 4 allocs/op
  24. BenchmarkFieldOrTagSuccess-8 2000000 740 ns/op 16 B/op 1 allocs/op
  25. BenchmarkFieldOrTagSuccessParallel-8 3000000 474 ns/op 16 B/op 1 allocs/op
  26. BenchmarkFieldOrTagFailure-8 3000000 471 ns/op 224 B/op 5 allocs/op
  27. BenchmarkFieldOrTagFailureParallel-8 3000000 414 ns/op 224 B/op 5 allocs/op
  28. BenchmarkStructLevelValidationSuccess-8 10000000 213 ns/op 32 B/op 2 allocs/op
  29. BenchmarkStructLevelValidationSuccessParallel-8 20000000 91.8 ns/op 32 B/op 2 allocs/op
  30. BenchmarkStructLevelValidationFailure-8 3000000 473 ns/op 304 B/op 8 allocs/op
  31. BenchmarkStructLevelValidationFailureParallel-8 10000000 234 ns/op 304 B/op 8 allocs/op
  32. BenchmarkStructSimpleCustomTypeSuccess-8 5000000 385 ns/op 32 B/op 2 allocs/op
  33. BenchmarkStructSimpleCustomTypeSuccessParallel-8 10000000 161 ns/op 32 B/op 2 allocs/op
  34. BenchmarkStructSimpleCustomTypeFailure-8 2000000 640 ns/op 424 B/op 9 allocs/op
  35. BenchmarkStructSimpleCustomTypeFailureParallel-8 5000000 318 ns/op 440 B/op 10 allocs/op
  36. BenchmarkStructFilteredSuccess-8 2000000 597 ns/op 288 B/op 9 allocs/op
  37. BenchmarkStructFilteredSuccessParallel-8 10000000 266 ns/op 288 B/op 9 allocs/op
  38. BenchmarkStructFilteredFailure-8 3000000 454 ns/op 256 B/op 7 allocs/op
  39. BenchmarkStructFilteredFailureParallel-8 10000000 214 ns/op 256 B/op 7 allocs/op
  40. BenchmarkStructPartialSuccess-8 3000000 502 ns/op 256 B/op 6 allocs/op
  41. BenchmarkStructPartialSuccessParallel-8 10000000 225 ns/op 256 B/op 6 allocs/op
  42. BenchmarkStructPartialFailure-8 2000000 702 ns/op 480 B/op 11 allocs/op
  43. BenchmarkStructPartialFailureParallel-8 5000000 329 ns/op 480 B/op 11 allocs/op
  44. BenchmarkStructExceptSuccess-8 2000000 793 ns/op 496 B/op 12 allocs/op
  45. BenchmarkStructExceptSuccessParallel-8 10000000 193 ns/op 240 B/op 5 allocs/op
  46. BenchmarkStructExceptFailure-8 2000000 639 ns/op 464 B/op 10 allocs/op
  47. BenchmarkStructExceptFailureParallel-8 5000000 300 ns/op 464 B/op 10 allocs/op
  48. BenchmarkStructSimpleCrossFieldSuccess-8 3000000 417 ns/op 72 B/op 3 allocs/op
  49. BenchmarkStructSimpleCrossFieldSuccessParallel-8 10000000 163 ns/op 72 B/op 3 allocs/op
  50. BenchmarkStructSimpleCrossFieldFailure-8 2000000 645 ns/op 304 B/op 8 allocs/op
  51. BenchmarkStructSimpleCrossFieldFailureParallel-8 5000000 285 ns/op 304 B/op 8 allocs/op
  52. BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 3000000 588 ns/op 80 B/op 4 allocs/op
  53. BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 10000000 221 ns/op 80 B/op 4 allocs/op
  54. BenchmarkStructSimpleCrossStructCrossFieldFailure-8 2000000 868 ns/op 320 B/op 9 allocs/op
  55. BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 5000000 337 ns/op 320 B/op 9 allocs/op
  56. BenchmarkStructSimpleSuccess-8 5000000 260 ns/op 0 B/op 0 allocs/op
  57. BenchmarkStructSimpleSuccessParallel-8 20000000 90.6 ns/op 0 B/op 0 allocs/op
  58. BenchmarkStructSimpleFailure-8 2000000 619 ns/op 424 B/op 9 allocs/op
  59. BenchmarkStructSimpleFailureParallel-8 5000000 296 ns/op 424 B/op 9 allocs/op
  60. BenchmarkStructComplexSuccess-8 1000000 1454 ns/op 128 B/op 8 allocs/op
  61. BenchmarkStructComplexSuccessParallel-8 3000000 579 ns/op 128 B/op 8 allocs/op
  62. BenchmarkStructComplexFailure-8 300000 4140 ns/op 3041 B/op 53 allocs/op
  63. BenchmarkStructComplexFailureParallel-8 1000000 2127 ns/op 3041 B/op 53 allocs/op
  64. BenchmarkOneof-8 10000000 140 ns/op 0 B/op 0 allocs/op
  65. BenchmarkOneofParallel-8 20000000 70.1 ns/op 0 B/op 0 allocs/op

配套软件

下面是在验证前或验证后使用此库进行补充的软件列表。

  • form,解码的url。将值输入value(s)和编码将值输入url.Values。双阵列和全地图支持。
  • mold,帮助在数据结构和其他对象中修改或设置数据的通用库