Go Struct 和 Field 验证,包括 Cross Field、Cross Struct、Map、Slice 和 Array diving

484 阅读6分钟

[

](#validator)验证器

GitHub Workflow Status Codecov GoDoc Sourcegraph

这是一个基于以下内容的修改版本 github.com/go-playground/validator/v10的基础上修改的,对绑定中间件有更好的i18n支持。

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

它有以下独特的功能。

  • 通过使用验证标签或自定义验证器进行跨字段和跨结构验证。
  • 切片、数组和地图潜入,允许对一个多维字段的任何或所有层次进行验证。
  • 能够潜入地图的键和值中进行验证。
  • 通过在验证前确定它的基本类型来处理类型接口。
  • 处理自定义字段类型,如sql驱动Valuer见Valuer
  • 别名验证标签,允许将几个验证映射到一个标签上,以方便定义结构上的验证。
  • 提取自定义定义的字段名,例如,可以指定在验证时提取JSON名称,并在产生的FieldError中提供该名称。
  • 可定制的i18n感知错误信息。

[

](#installation)安装

Go的最低要求是1.16

go get github.com/flamego/validator

[

](#error-return-value)错误返回值

验证函数返回类型错误,以避免下面讨论的问题,即err总是 != nil。

Validator只对错误的验证输入返回InvalidValidationError,对类型错误返回nil或ValidationErrors;因此,在你的代码中,你需要做的是检查返回的错误是否为nil,如果不是,则检查错误是否为InvalidValidationError(如果需要,大多数情况下不是),像这样将其类型转换为ValidationErrors类型。

err

[

](#usage-and-documentation)使用方法和文档

请参阅pkg.go.dev/github.com/…,了解详细的使用文档。

[

](#examples)实例

[

](#baked-in-validations)嵌入验证器

[

](#fields)领域

标签描述
eqcsfield字段等同于另一个字段(相对)。
符号字段等同于另一个字段
字段包含未记录在doc.go中
字段不包括未记录在doc.go中
gtcsfield大于另一相对字段的字段
gtecsfield大于或等于另一个相对字段的字段
gtefield大于或等于另一个字段的字段
场地大于另一个字段的字段
ltcsfield小于另一个相对字段
小于或等于另一个相对字段小于或等于另一个相对字段
ltefield小于或等于另一个字段
梯田小于另一个字段
小于或等于另一字段字段不等于另一字段(相对
场地字段不等于另一字段

[

](#network)网络

标签标签描述
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字符串

[

](#strings)字符串

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

[

](#format)格式化

标签描述
基准64Base64字符串
编码Base64URL字符串
bic商业识别码(ISO 9362)。
bcp47_language_tag语言标签(BCP47)。
btc_addr比特币地址
btc_addr_bech32比特币Bech32地址(segwit)
日期时间日期时间
e164e164格式的电话号码
电子邮件E-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

[

](#comparisons)比较

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

[

](#other)其他

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

[

](#aliases)别名

标签描述
颜料肤色rgbrgbahslhsla
国家代码iso3166_1_alpha2iso3166_1_alpha3iso3166_1_alpha_numeric

[

](#license)许可证

本项目采用MIT许可协议。参见LICENSE文件中的完整许可文本。

GitHub

github.com/flamego/val…