github.com/go-playground/validator
范围约束
-
对于字符串、切片、数组和map,约束其长度。
len=10
,min=6
,max=10
,gt=10
。 -
对于数值,约束其取值。
min
,max
,eq
,ne
,gt
,gte
,lt
,lte
,oneof=6 8
。
Fields
标签 | 描述 |
---|---|
eqcsfield | 字段等于另一个字段(相对) |
eqfield | 字段等于另一个字段 |
fieldcontains | 没有记录在 doc.go 中 |
fieldexcludes | 没有记录在 doc.go 中 |
gtcsfield | 大于另一个相关字段的字段 |
gtecsfield | 字段大于或等于另一个相关字段 |
gtefield | 字段大于或等于另一个字段 |
gtfield | 字段大于另一个字段 |
ltcsfield | 小于另一个相关字段 |
ltecsfield | 小于或等于另一个相关字段 |
ltefield | 小于或等于另一个字段 |
ltfield | 小于另一个字段 |
necsfield | 字段不等于另一个字段(相对) |
nefield | 字段不等于另一个字段 |
网络
标签 | 描述 |
---|---|
cidr | 无类域间路由 CIDR |
cidrv4 | 无类域间路由 CIDRv4 |
cidrv6 | 无类域间路由 CIDRv6 |
datauri | 资料网址 |
fqdn | 完全限定域名 (FQDN) |
hostname | 主机名 RFC 952 |
hostname_port | 主机端口 |
hostname_rfc1123 | 主机名 RFC 1123 |
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域套接字端点地址 |
uri | 字符串 |
url | 网址字符串 |
url_encoded | 网址编码 |
urn_rfc2141 | 瓮 RFC 2141 字符串 |
字符串
标签 | 描述 |
---|---|
alpha | 仅限阿尔法 |
alphanum | 字母数字 |
alphanumunicode | 字母数字 Unicode |
alphaunicode | 阿尔法统一码 |
ascii | ASCII码 |
boolean | 布尔值 |
contains | 包含 |
containsany | 包含任何 |
containsrune | 包含符文 |
endsnotwith | 结尾不是 |
endswith | 以。。结束 |
excludes | 排除 |
excludesall | 排除所有 |
excludesrune | 不包括符文 |
lowercase | 小写 |
multibyte | 多字节字符 |
number | 没有记录在 doc.go 中 |
numeric | 数字 |
printascii | 可打印的 ASCII |
startsnotwith | 开头不是 |
startswith | 以。。开始 |
uppercase | 大写 |
格式
标签 | 描述 |
---|---|
base64 | Base64 字符串 |
base64url | Base64URL 字符串 |
bic | 企业识别码 (ISO 9362) |
bcp47_language_tag | 语言标签 (BCP 47) |
btc_addr | 比特币地址 |
btc_addr_bech32 | 比特币 Bech32 地址(segwit) |
credit_card | 信用卡号 |
datetime | 约会时间 |
e164 | e164格式电话号码 |
电子邮件字符串 | |
eth_addr | 以太坊地址 |
hexadecimal | 十六进制字符串 |
hexcolor | 六角色字符串 |
hsl | HSL字符串 |
hsla | HSLA 字符串 |
html | 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) |
JSON | JSON |
jwt | JSON 网络令牌 (JWT) |
latitude | 纬度 |
longitude | 经度 |
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 哈希 |
ripemd160 | RIPEMD-160 哈希 |
tiger128 | TIGER128 哈希 |
tiger160 | TIGER160 哈希 |
tiger192 | TIGER192 哈希 |
semver | 语义版本控制 2.0.0 |
ulid | 普遍唯一的字典排序标识符 ULID |
比较
标签 | 描述 |
---|---|
eq | 等于 |
gt | 比...更棒 |
gte | 大于或等于 |
lt | 少于 |
lte | 小于或等于 |
ne | 不等于 |
其他
标签 | 描述 |
---|---|
dir | 目录 |
file | 文件路径 |
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 | 独特的 |
简单使用
package main
import (
"fmt"
"github.com/go-playground/validator"
)
func fn5() {
//创建结构体 设置校验
type RegistRequest struct {
UserName string `validate:"gt=0"` // >0 长度大于0
PassWord string `validate:"min=6,max=12"` //密码长度[6, 12]
PassRepeat string `validate:"eqfield=PassWord"` //跨字段相等校验
Email string `validate:"email"` //需要满足email的格式
}
reg := RegistRequest{
UserName: "1",
PassWord: "abc",
PassRepeat: "abcdef",
Email: "123.com",
}
//创建校验
v := validator.New()
//校验
err := v.Struct(reg) //Struct()返回的error分为两种类型:InvalidValidationError和ValidationErrors
//根据返回的错误,做出相应的处理
if err != nil {
//InvalidValidationError是传入了非法的参数
invalid, ok := err.(*validator.InvalidValidationError)
if ok {
fmt.Println("传输的参数有误", "\n错误消息为:", invalid)
}
//ValidationErrors是对校验的不通过的返回
validationErrs := err.(validator.ValidationErrors)
for _, v := range validationErrs {
fmt.Println(v.Field(), "不满足要求", v.Tag())
}
}
}
func main() {
fn5()
}
/*
PassWord 不满足要求 min
PassRepeat 不满足要求 eqfield
Email 不满足要求 email
*/
要点:
- 需要先初始化校验
v := validator.New()
用返回的v来校验结构体 - 校验 将结构体传入
err := v.Struct(reg)
返回的是校验结果 func (v *Validate) Struct(s interface{}) error
返回的error分为两种类型:InvalidValidationError和ValidationErrors- InvalidValidationError类型的err是传参异常
- ValidationErrors 类型则是对校验结果的返回,是一个切片
- 需要手动的去断言
跨字段约束
- 跨字段就在范围约束的基础上加field后缀。
范围约束+field
。例如eqfield
- 如果还跨结构体(cross struct)就在跨字段的基础上在field前面加cs:
范围约束+cs+field
。例如eqcsfield
跨字段指的是不同结构体
//结构体嵌套 然后之间的字段相互校验
type User struct {
Passwd string `validate:"min=6,max=12"`
}
type RegistRequest struct {
UserName string `validate:"gt=0"` // >0 长度大于0
PassWord string `validate:"eqcsfield=User.Passwd"` //跨结构体相等校验
Rpassword string `validate:"eqfield=PassWord"` //跨字段相等校验
User User
}
reg := RegistRequest{
UserName: "1",
PassWord: "abcd",
Rpassword: "abcd",
User: User{Passwd: "abcdef"},
}
字符串约束
- contains包含子串。
- containsany包含任意unicode字符, containsany=abcd。
- containsrune包含rune字符, containsrune= ☻。
- excludes不包含子串。
- excludesall不包含任意的unicode字符,excludesall=abcd。
- excludesrune不包含rune字符,excludesrune=☻。
- startswith以子串为前缀。
- endswith以子串为后缀。
type RegistRequest struct {
UserName string `validate:"contains=abcd"` //包含校验
PassWord string `validate:"excludes=abcd"` //不包含校验
RPassWord string `validate:"containsany=abcd"` //至少包含其中的一个
}
reg := RegistRequest{
UserName: "1abcd", //通过
PassWord: "abcdef", //不通过
RPassWord: "a123", //通过
}
唯一性uniq
- 对于数组和切片,约束没有重复的元素。
- 对于map,约束没的重复的value。
- 对于元素类型为结构体的切片,unique约束结构体对象的某个字段不重复,通过unique=field指定这个字段名。
Friends []Uservalidate:"unique=Name"
type RegistRequest struct {
Id []int `validate:"unique"` //唯一性校验
UserName string `validate:"gt=0"`
PassWord string `validate:"min=6,max=12"`
}
reg := RegistRequest{
Id: []int{1, 2, 1},
UserName: "1",
PassWord: "abcdef",
}
自定义约束
func validateEmail(fl validator.FieldLevel) bool {
input := fl.Field().String()
if pass, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,})\.([a-z]{2,4})$`, input); pass {
return true
}
return false
}
//注册一个自定义的validator
val.RegisterValidation("my_email", validateEmail)
Email string `validate:"my_email"`
例子
package main
import (
"fmt"
"github.com/go-playground/validator"
)
//新建校验函数
func Jiaoyan(fl validator.FieldLevel) bool {
field := fl.Field().String()
if field != "abc" {
return false
}
return true
}
func fn5() {
//创建结构体 设置校验
type RegistRequest struct {
//调用校验方法
UserName string `validate:"jiaoyan"` //自定义校验
Passwd string `validate:"jiaoyan"`
}
reg := RegistRequest{
UserName: "abc", //通过
Passwd: "ab1c", //不通过
}
//创建校验
v := validator.New()
//注册校验方法
v.RegisterValidation("jiaoyan", Jiaoyan)
//校验
err := v.Struct(reg) //Struct()返回的error分为两种类型:InvalidValidationError和ValidationErrors
//根据返回的错误,做出相应的处理
if err != nil {
//InvalidValidationError是传入了非法的参数
invalid, ok := err.(*validator.InvalidValidationError)
if ok {
fmt.Println("传输的参数有误", "\n错误消息为:", invalid)
}
//ValidationErrors是对校验的不通过的返回
validationErrs := err.(validator.ValidationErrors)
for _, v := range validationErrs {
fmt.Println(v.Field(), "不满足要求", v.Tag())
}
}
}
func main() {
fn5()
}
标签:PassWord,addr,校验,validator,Go,validate,结构,string
From: https://www.cnblogs.com/guangdelw/p/17034047.html