当前位置: 首页 > ai >正文

validator - Go 结构体验证库

本文翻译整理自:https://github.com/go-playground/validator


一、关于 validator

validator 包实现了基于标签的结构体和字段值验证功能。


相关链接资源

  • github : https://github.com/go-playground/validator
  • 官方文档:https://pkg.go.dev/github.com/go-playground/validator/v10
  • License : MIT

关键功能特性

具有以下独特功能:
1、通过验证标签或自定义验证器实现跨字段和跨结构体验证
2、支持切片、数组和映射的多层级嵌套验证
3、可同时验证映射的键和值
4、验证前自动识别接口的实际类型
5、支持自定义字段类型(如实现了 sql.driver.Valuer 接口的类型)
6、别名验证标签,可将多个验证映射到单个标签以简化结构体定义
7、可提取自定义字段名(如提取 JSON 字段名用于错误提示)
8、支持可定制的国际化错误消息
9、作为 gin 框架的默认验证器(从 v8 升级到 v9 的指南见 https://github.com/go-playground/validator/tree/master/_examples/gin-upgrading-overriding)


二、维护者招募

有意参与维护本项目的开发者请阅读 https://github.com/go-playground/validator/discussions/1330 中的讨论。


三、安装

使用 go get 安装:

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

然后在代码中导入:

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

四、错误返回值

验证函数返回 error 类型,这种设计避免了以下讨论中提到的问题(err 总是 != nil):

  • http://stackoverflow.com/a/29138676/3158232
  • https://github.com/go-playground/validator/issues/134

验证器仅对错误的验证输入返回 InvalidValidationError,正常情况下返回 nil 或 ValidationErrors。因此代码中只需检查返回的 error 是否为 nil,必要时可将其转换为 ValidationErrors 类型:

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

五、使用文档

详细用法请参考:https://pkg.go.dev/github.com/go-playground/validator/v10


示例代码

  • 基础用法
  • 自定义字段类型
  • 结构体层级验证
  • 多语言与自定义错误
  • Gin 框架验证器升级/覆盖
  • 完整示例应用 wash

六、内置验证规则


特别说明

对于新用户,强烈建议使用 WithRequiredStructEnabled 选项初始化验证器,该选项启用了将在 v11+ 版本成为默认行为的新特性:

validate := validator.New(validator.WithRequiredStructEnabled())

字段验证

标签描述
eqcsfield等于另一个相对字段
eqfield等于另一个字段
fieldcontains字段包含指定字符
fieldexcludes字段不包含指定字符
gtcsfield大于另一个相对字段
gtecsfield大于等于另一个相对字段
gtefield大于等于另一个字段
gtfield大于另一个字段
ltcsfield小于另一个相对字段
ltecsfield小于等于另一个相对字段
ltefield小于等于另一个字段
ltfield小于另一个字段
necsfield不等于另一个相对字段
nefield不等于另一个字段

网络验证

标签描述
cidr无类别域间路由 CIDR
cidrv4IPv4 CIDR
cidrv6IPv6 CIDR
datauri数据 URL
fqdn完全限定域名
hostname主机名 (RFC 952)
hostname_port主机端口
hostname_rfc1123主机名 (RFC 1123)
ipIP 地址
ip4_addrIPv4 地址
ip6_addrIPv6 地址
ip_addrIP 地址
ipv4IPv4 地址
ipv6IPv6 地址
macMAC 地址
tcp4_addrTCPv4 地址
tcp6_addrTCPv6 地址
tcp_addrTCP 地址
udp4_addrUDPv4 地址
udp6_addrUDPv6 地址
udp_addrUDP 地址
unix_addrUnix 域套接字地址
uriURI 字符串
urlURL 字符串
http_urlHTTP URL 字符串
url_encodedURL 编码字符串
urn_rfc2141URN (RFC 2141) 字符串

字符串验证

标签描述
alpha仅字母
alphanum字母数字
alphanumunicodeUnicode 字母数字
alphaunicodeUnicode 字母
asciiASCII 字符
boolean布尔值
contains包含指定字符串
containsany包含任意指定字符
containsrune包含指定 rune
endsnotwith不以指定字符串结尾
endswith以指定字符串结尾
excludes不包含指定字符串
excludesall不包含任何指定字符
excludesrune不包含指定 rune
lowercase小写字母
multibyte多字节字符
number数字
numeric数值
printascii可打印 ASCII 字符
startsnotwith不以指定字符串开头
startswith以指定字符串开头
uppercase大写字母

格式验证

标签描述
base64Base64 字符串
base64urlBase64URL 字符串
base64rawurlBase64RawURL 字符串
bic银行标识码 (ISO 9362)
bcp47_language_tag语言标签 (BCP 47)
btc_addr比特币地址
btc_addr_bech32比特币 Bech32 地址 (segwit)
credit_card信用卡号
mongodbMongoDB ObjectID
mongodb_connection_stringMongoDB 连接字符串
cronCron 表达式
spicedbSpiceDb ObjectID/权限/类型
datetime日期时间
e164E.164 格式电话号码
ein美国雇主识别号
email电子邮件地址
eth_addr以太坊地址
hexadecimal十六进制字符串
hexcolor十六进制颜色值
hslHSL 颜色值
hslaHSLA 颜色值
htmlHTML 标签
html_encodedHTML 编码字符串
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)
jsonJSON 字符串
jwtJSON Web Token
latitude纬度
longitude经度
luhn_checksumLuhn 算法校验和
postcode_iso3166_alpha2邮政编码
postcode_iso3166_alpha2_field邮政编码字段
rgbRGB 颜色值
rgbaRGBA 颜色值
ssn社会安全号码
timezone时区
uuid通用唯一标识符
uuid3UUID v3
uuid3_rfc4122UUID v3 (RFC4122)
uuid4UUID v4
uuid4_rfc4122UUID v4 (RFC4122)
uuid5UUID v5
uuid5_rfc4122UUID v5 (RFC4122)
uuid_rfc4122UUID (RFC4122)
md4MD4 哈希
md5MD5 哈希
sha256SHA256 哈希
sha384SHA384 哈希
sha512SHA512 哈希
ripemd128RIPEMD-128 哈希
ripemd128RIPEMD-160 哈希
tiger128TIGER128 哈希
tiger160TIGER160 哈希
tiger192TIGER192 哈希
semver语义化版本 2.0.0
ulid通用唯一字典排序标识符
cve通用漏洞披露标识符

比较验证

标签描述
eq等于
eq_ignore_case等于(忽略大小写)
gt大于
gte大于等于
lt小于
lte小于等于
ne不等于
ne_ignore_case不等于(忽略大小写)

其他验证

标签描述
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验证方法不返回错误

别名
标签描述
iscolorhexcolor
country_codeiso3166_1_alpha2

七、性能基准

测试环境: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                                  808136
http://www.xdnf.cn/news/3728.html

相关文章:

  • 每天五分钟深度学习框架PyTorch:基于Dataset封装自定义数据集
  • 深入理解Java垃圾回收机制
  • NV228NV254固态美光颗粒NV255NV263
  • 2025年01月03日美蜥(杭州普瑞兼职)一面
  • 【C++ Qt】输入类控件(上) LineEdit、QTextEdit
  • 升级 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后验证指南:功能与虚拟环境检测
  • 黑马点评day01(基于Redis)
  • C++学习:六个月从基础到就业——C++11/14:右值引用与移动语义
  • Webug4.0靶场通关笔记14- 第18关 文件上传之Nginx解析缺陷
  • Linux线程深度解析:从基础到实践
  • 码蹄集——偶数位、四边形坐标
  • 南京优质的公司有哪些?
  • 小程序 IView WeappUI组件库(简单增删改查)
  • 变更需求代价:影响分析
  • Java面试大纲(以及常见面试问答)
  • 19、权限控制:分院帽系统——React 19 RBAC实现
  • iview自定义下拉树菜单
  • 【C++】 —— 笔试刷题day_25
  • C++多态(下)
  • 【办公类-99-04】20250504闵豆统计表excle转PDF,合并PDF、添加中文字体页眉+边框下划线
  • 观察者模式(Observer Pattern)详解
  • 计算机系统结构 第二章 :缓存优化
  • vector的两种实现
  • Java并发编程-多线程基础(二)
  • 【信息系统项目管理师】【历年真题】论文中需要会画的图/表格
  • JavaScript基础-运算符优先级
  • GCD 深入解析:从使用到底层实现
  • Linux实验课二(重点:动态链接库,makefile使用)
  • 【JS逆向】某点数据登录逆向分析
  • StandardCopyOption 还有哪些其他可用的常量?