go-playground/validator

GitHub: go-playground/validator

Go 语言高性能结构体验证库,通过标签实现声明式字段校验,支持跨字段、嵌套结构和国际化错误消息。

Stars: 19792 | Forks: 1410

# Package 验证器 [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/go-playground/validator)](https://github.com/go-playground/validator/releases) [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/2ba0629201191027.svg)](https://github.com/go-playground/validator/actions) [![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator) [![GoDoc](https://godoc.org/github.com/go-playground/validator?status.svg)](https://pkg.go.dev/github.com/go-playground/validator/v10) ![License](https://img.shields.io/dub/l/vibe-d.svg) Package validator 基于标签为结构体和单个字段实现值验证。 它具有以下**独特**功能: - 通过使用验证标签或自定义验证器,支持跨字段和跨结构体验证。 - Slice、Array 和 Map 深入(diving),允许验证多维字段的任意或所有层级。 - 能够深入 map 的键和值进行验证。 - 通过在验证前确定底层类型来处理接口类型。 - 处理自定义字段类型,例如 sql driver [Valuer](https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29) 和 [Valuer interface](https://github.com/go-playground/validator/blob/master/_examples/valuer/main.go) - 别名验证标签,允许将多个验证映射到单个标签,以便更轻松地在结构体上定义验证。 - 提取自定义定义的字段名,例如,可以指定在验证时提取 JSON 名称,并使其在生成的 FieldError 中可用。 - 可定制的 i18n 感知错误消息。 - [gin](https://github.com/gin-gonic/gin) web 框架的默认验证器;在 gin 中从 v8 升级到 v9 请参见[此处](https://github.com/go-playground/validator/tree/master/_examples/gin-upgrading-overriding) ## 维护者招募 如果您有兴趣贡献或帮助维护此 package,请阅读[此处](https://github.com/go-playground/validator/discussions/1330)开始的讨论。 ## 安装 使用 go get。 ``` go get github.com/go-playground/validator/v10 ``` 然后将 validator package 导入您自己的代码中。 ``` import "github.com/go-playground/validator/v10" ``` ## 错误返回值 验证函数返回 error 类型。 它们返回 error 类型是为了避免以下讨论的问题,即 err 总是 != nil: * http://stackoverflow.com/a/29138676/3158232 * https://github.com/go-playground/validator/issues/134 Validator 仅针对错误的验证输入返回 InvalidValidationError,nil 或 ValidationErrors 作为 error 类型;因此,在您的代码中,您只需要检查返回的 error 是否不为 nil,如果不为 nil,再检查 error 是否为 InvalidValidationError(如有必要,大多数情况下不需要),将其类型断言为 ValidationErrors 类型,如下所示: ``` err := validate.Struct(mystruct) validationErrors := err.(validator.ValidationErrors) ``` ## 用法和文档 详细的使用文档请参阅 https://pkg.go.dev/github.com/go-playground/validator/v10。 ##### 示例: - [简单示例](https://github.com/go-playground/validator/blob/master/_examples/simple/main.go) - [自定义字段类型](https://github.com/go-playground/validator/blob/master/_examples/custom/main.go) - [结构体级别](https://github.com/go-playground/validator/blob/master/_examples/struct-level/main.go) - [翻译与自定义错误](https://github.com/go-playground/validator/blob/master/_examples/translations/main.go) - [Gin 升级和/或覆盖 validator](https://github.com/go-playground/validator/tree/v9/_examples/gin-upgrading-overriding) - [wash - 一个将其整合在一起的示例应用](https://github.com/bluesuncorp/wash) ## 内置验证 ### 特别说明: - 如果初次使用 validator,强烈建议使用 `WithRequiredStructEnabled` 选项进行初始化,该选项是 v11+ 版本中将称为默认行为的新特性的可选启用。详情请参阅文档。 ``` validate := validator.New(validator.WithRequiredStructEnabled()) ``` ### 字段: | Tag | Description | | - | - | | eqcsfield | 字段等于另一个字段(相对)| | eqfield | 字段等于另一个字段 | | fieldcontains | 检查字段中是否存在指定的字符 | | fieldexcludes | 检查字段中是否不存在指定的字符 | | gtcsfield | 字段大于另一个相对字段 | | gtecsfield | 字段大于或等于另一个相对字段 | | gtefield | 字段大于或等于另一个字段 | | gtfield | 字段大于另一个字段 | | ltcsfield | 小于另一个相对字段 | | ltecsfield | 小于或等于另一个相对字段 | | ltefield | 小于或等于另一个字段 | | ltfield | 小于另一个字段 | | necsfield | 字段不等于另一个字段(相对)| | nefield | 字段不等于另一个字段 | ### 网络: | Tag | Description | | - | - | | cidr | 无类别域间路由 CIDR | | cidrv4 | 无类别域间路由 CIDRv4 | | cidrv6 | 无类别域间路由 CIDRv6 | | datauri | Data URL | | fqdn | 完全限定域名 (FQDN) | | hostname | 主机名 RFC 952 | | hostname_rfc1123 | 主机名 RFC 1123 | | hostname_port | 主机端口 | | port | 端口号 | | 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 域套接字端点地址 | | uds_exists | Unix 域套接字存在(检查文件系统套接字和 Linux 抽象套接字)| | uri | URI 字符串 | | url | URL 字符串 | | http_url | HTTP(s) URL 字符串 | | https_url | 仅 HTTPS URL 字符串 | | url_encoded | URL 编码 | | urn_rfc2141 | Urn RFC 2141 字符串 | ### 字符串: | Tag | Description | | - | - | | alpha | 仅字母 | | alphaspace | 字母空格 | | alphanum | 字母数字 | | alphanumspace | 字母数字空格 | | alphanumunicode | 字母数字 Unicode | | alphaunicode | 字母 Unicode | | ascii | ASCII | | boolean | 布尔值 | | contains | 包含 | | containsany | 包含任意 | | containsrune | 包含 Rune | | endsnotwith | 不以...结尾 | | endswith | 以...结尾 | | excludes | 排除 | | excludesall | 排除所有 | | excludesrune | 排除 Rune | | lowercase | 小写 | | multibyte | 多字节字符 | | number | 数字 | | numeric | 数值 | | printascii | 可打印 ASCII | | startsnotwith | 不以...开头 | | startswith | 以...开头 | | uppercase | 大写 | ### 格式: | Tag | Description | | - | - | | base64 | Base64 字符串 | | base64url | Base64URL 字符串 | | base64rawurl | Base64RawURL 字符串 | | bic_iso_9362_2014 | 业务标识符代码 (ISO 9362:2014) | | bic | 业务标识符代码 (ISO 9362:2022) | | bcp47_language_tag | 语言标签 (BCP 47) | | btc_addr | 比特币地址 | | btc_addr_bech32 | 比特币 Bech32 地址 (segwit) | | credit_card | 信用卡号 | | mongodb | MongoDB ObjectID | | mongodb_connection_string | MongoDB 连接字符串 | | cron | Cron | | spicedb | SpiceDb ObjectID/Permission/Type | | datetime | 日期时间 | | e164 | e164 格式电话号码 | | ein | 美国雇主识别号 | | email | 电子邮件字符串 | eth_addr | 以太坊地址 | | hexadecimal | 十六进制字符串 | | hexcolor | 十六进制颜色字符串 | | hsl | HSL 字符串 | | hsla | HSLA 字符串 | | cmyk | CMYK 字符串 | | html | HTML 标签 | | html_encoded | HTML 编码 | | 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) | | json | JSON | | jwt | JSON Web Token (JWT) | | latitude | 纬度 | | longitude | 经度 | | luhn_checksum | Luhn 算法校验和(用于字符串和 (u)int)| | postcode_iso3166_alpha2 | 邮政编码 | | postcode_iso3166_alpha2_field | 邮政编码 | | rgb | RGB 字符串 | | rgba | RGBA 字符串 | | ssn | 社会保障号 SSN | | timezone | 时区 | | 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 哈希 | | sha384 | SHA384 哈希 | | sha512 | SHA512 哈希 | | ripemd128 | RIPEMD-128 哈希 | | ripemd128 | RIPEMD-160 哈希 | | tiger128 | TIGER128 哈希 | | tiger160 | TIGER160 哈希 | | tiger192 | TIGER192 哈希 | | semver | 语义化版本 2.0.0 | | ulid | 通用唯一字典排序标识符 ULID | | cve | 通用漏洞披露标识符 (CVE id) | ### 比较: | Tag | Description | | - | - | | eq | 等于 | | eq_ignore_case | 等于(忽略大小写)| | gt | 大于| | gte | 大于或等于 | | lt | 小于 | | lte | 小于或等于 | | ne | 不等于 | | ne_ignore_case | 不等于(忽略大小写)| ### 其他: | Tag | Description | | - | - | | 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 | 验证方法 `Validate() error` 是否未返回错误(或任何指定的方法)| #### 别名: | Tag | Description | | - | - | | iscolor | hexcolor\|rgb\|rgba\|hsl\|hsla\|cmyk | | country_code | iso3166_1_alpha2\|iso3166_1_alpha3\|iso3166_1_alpha_numeric | ## 基准测试 ###### 运行于 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 8081367 154.1 ns/op 424 B/op 8 allocs/op BenchmarkStructSimpleCrossFieldSuccess-16 6459542 183.4 ns/op 56 B/op 3 allocs/op BenchmarkStructSimpleCrossFieldSuccessParallel-16 41013781 37.95 ns/op 56 B/op 3 allocs/op BenchmarkStructSimpleCrossFieldFailure-16 4034998 292.1 ns/op 272 B/op 8 allocs/op BenchmarkStructSimpleCrossFieldFailureParallel-16 11348446 115.3 ns/op 272 B/op 8 allocs/op BenchmarkStructSimpleCrossStructCrossFieldSuccess-16 4448528 267.7 ns/op 64 B/op 4 allocs/op BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-16 26813619 48.33 ns/op 64 B/op 4 allocs/op BenchmarkStructSimpleCrossStructCrossFieldFailure-16 3090646 384.5 ns/op 288 B/op 9 allocs/op BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-16 9870906 129.5 ns/op 288 B/op 9 allocs/op BenchmarkStructSimpleSuccess-16 10675562 109.5 ns/op 0 B/op 0 allocs/op BenchmarkStructSimpleSuccessParallel-16 131159784 8.932 ns/op 0 B/op 0 allocs/op BenchmarkStructSimpleFailure-16 4094979 286.6 ns/op 416 B/op 9 allocs/op BenchmarkStructSimpleFailureParallel-16 7606663 157.9 ns/op 416 B/op 9 allocs/op BenchmarkStructComplexSuccess-16 2073470 576.0 ns/op 224 B/op 5 allocs/op BenchmarkStructComplexSuccessParallel-16 7821831 161.3 ns/op 224 B/op 5 allocs/op BenchmarkStructComplexFailure-16 576358 2001 ns/op 3042 B/op 48 allocs/op BenchmarkStructComplexFailureParallel-16 1000000 1171 ns/op 3041 B/op 48 allocs/op BenchmarkOneof-16 22503973 52.82 ns/op 0 B/op 0 allocs/op BenchmarkOneofParallel-16 8538474 140.4 ns/op 0 B/op 0 allocs/op ``` ## 互补软件 以下是在验证之前或之后补充使用此库的软件列表。 * [form](https://github.com/go-playground/form) - 将 url.Values 解码为 Go 值,并将 Go 值编码为 url.Values。支持双数组和完整 map。 * [mold](https://github.com/go-playground/mold) - 一个通用库,用于帮助修改或设置数据结构和其他对象中的数据 ## SDK 主要版本的维护和支持 更多详情请参阅[此处](_URL_18/>)之前的讨论。 此 package 与 [Go 发布策略](https://go.dev/doc/devel/release)保持一致,即保证支持 最近的两个主要版本。 这并不意味着该 package 不适用于旧版本的 Go,仅表示我们保留在需要解决安全问题/补丁、操作系统问题和支持 或新引入的功能(将极大地有益于此 package 的维护和/或使用)时 提高 MSGV(最低支持 Go 版本)的权利。 如果并且当提高 MSGV 时,将至少在 `Minor` 版本更新中进行。 ## 许可证 根据 MIT 许可证分发,请在代码中的许可证文件中查看更多详细信息。 ## 维护者 这个项目已经发展到足够大,需要不止一个人来适当支持社区。 如果您有兴趣成为维护者,请通过 https://github.com/deankarn 联系我
标签:API密钥检测, Gin, Gin框架, Go, Golang, Go-playground, i18n, Map验证, Ruby工具, Slice验证, Struct Tag, Struct Validator, Syscall, Web开发, 参数验证, 反射, 后端开发, 国际化, 安全编程, 安全过滤, 开源库, 搜索引擎爬虫, 数据校验, 数据清洗, 日志审计, 跨字段验证, 输入验证, 错误处理