说明
-
参考文档:https://pkg.go.dev/github.com/go-playground/validator/v10#hdr-StructOnly
-
使用说明
validate:"Usage" v := validator.New() if err:=v.Struct(user); err !=nil { } err := validate.Var(boolTest, "required") if err != nil { fmt.Println(err) }
tag | desc | ex |
required | 必填 | Field或Struct validate:"required" |
unique | 保证唯一性,不同类型处理不同; 对于map,unique约束没有重复的value值; 对于数组和切片,没有重复的元素值 | Field validate:"unique" |
omitempty | 空时忽略 | Field或Struct validate:"omitempty" |
len | 长度 | Field validate:"len=0" |
eq | 等于 | Field validate:"eq=0" |
gt | 大于 | Field validate:"gt=0" |
gte | 大于等于 | Field validate:"gte=0" |
lt | 小于 | Field validate:"lt=0" |
lte | 小于等于 | Field validate:"lte=0" |
eqfield | 同一结构体字段相等 | Field validate:"eqfield=Field2" |
nefield | 同一结构体字段不相等 | Field validate:"nefield=Field2" |
gtfield | 大于同一结构体字段 | Field validate:"gtfield=Field2" |
gtefield | 大于等于同一结构体字段 | Field validate:"gtefield=Field2" |
ltfield | 小于同一结构体字段 | Field validate:"ltfield=Field2" |
ltefield | 小于等于同一结构体字段 | Field validate:"ltefield=Field2" |
eqcsfield | 跨不同结构体字段相等 | Struct1.Field validate:"eqcsfield=Struct2.Field2" |
necsfield | 跨不同结构体字段不相等 | Struct1.Field validate:"necsfield=Struct2.Field2" |
gtcsfield | 大于跨不同结构体字段 | Struct1.Field validate:"gtcsfield=Struct2.Field2" |
gtecsfield | 大于等于跨不同结构体字段 | Struct1.Field validate:"gtecsfield=Struct2.Field2" |
ltcsfield | 小于跨不同结构体字段 | Struct1.Field validate:"ltcsfield=Struct2.Field2" |
ltecsfield | 小于等于跨不同结构体字段 | Struct1.Field validate:"ltecsfield=Struct2.Field2" |
min | 最大值 | Field validate:"min=1" |
max | 最小值 | Field validate:"max=2" |
structonly | 仅验证结构体,不验证任何结构体字段 | Struct validate:"structonly" |
nostructlevel | 不运行任何结构级别的验证 | Struct validate:"nostructlevel" |
dive | 向下延伸验证,多层向下需要多个dive标记 | string validate:"gt=0,dive,len=1,dive,required" |
dive Keys & EndKeys | 与dive同时使用,用于对map对象的键的和值的验证,keys为键,endkeys为值 | map[string]string `validate:”gt=0,dive,keys,eq=1 | |
required_with | 其他字段其中一个不为空且当前字段不为空 | Field validate:"required_with=Field1 Field2" |
required_with_all | 其他所有字段不为空且当前字段不为空 | Field validate:"required_with_all=Field1 Field2" |
required_without | 其他字段其中一个为空且当前字段不为空 | Field `validate:”required_without=Field1 Field2” | |
required_without_all | 其他所有字段为空且当前字段不为空 | Field validate:"required_without_all=Field1 Field2" |
isdefault | 是默认值 | Field validate:"isdefault=0" |
oneof | 其中之一 | Field validate:"oneof=5 7 9" |
containsfield | 字段包含另一个字段 | Field validate:"containsfield=Field2" |
excludesfield | 字段不包含另一个字段 | Field validate:"excludesfield=Field2" |
unique | 是否唯一,通常用于切片或结构体 | Field validate:"unique" |
alphanum | 字符串值是否只包含 ASCII 字母数字字符 | Field validate:"alphanum" |
alphaunicode | 字符串值是否只包含 unicode 字符 | Field validate:"alphaunicode" |
alphanumunicode | 字符串值是否只包含 unicode 字母数字字符 | Field validate:"alphanumunicode" |
numeric | 字符串值是否包含基本的数值 | Field validate:"numeric" |
hexadecimal | 字符串值是否包含有效的十六进制 | Field validate:"hexadecimal" |
hexcolor | 字符串值是否包含有效的十六进制颜色 | Field validate:"hexcolor" |
lowercase | 符串值是否只包含小写字符 | Field validate:"lowercase" |
uppercase | 符串值是否只包含大写字符 | Field validate:"uppercase" |
字符串值包含一个有效的电子邮件 | Field validate:"email" | |
json | 字符串值是否为有效的 JSON | Field validate:"json" |
file | 符串值是否包含有效的文件路径,以及该文件是否存在于计算机上 | Field validate:"file" |
url | 符串值是否包含有效的 url | Field validate:"url" |
uri | 符串值是否包含有效的 uri | Field validate:"uri" |
base64 | 字符串值是否包含有效的 base64值 | Field validate:"base64" |
contains | 字符串值包含子字符串值 | Field validate:"contains=@" |
containsany | 字符串值包含子字符串值中的任何字符 | Field validate:"containsany=abc" |
containsrune | 字符串值包含提供的特殊符号值 | Field validate:"containsrune=☢" |
excludes | 字符串值不包含子字符串值 | Field validate:"excludes=@" |
excludesall | 字符串值不包含任何子字符串值 | Field validate:"excludesall=abc" |
excludesrune | 字符串值不包含提供的特殊符号值 | Field validate:"containsrune=☢" |
startswith | 字符串以提供的字符串值开始 | Field validate:"startswith=abc" |
endswith | 字符串以提供的字符串值结束 | Field validate:"endswith=abc" |
ip | 字符串值是否包含有效的 IP 地址 | Field validate:"ip" |
ipv4 | 字符串值是否包含有效的 ipv4地址 | Field validate:"ipv4" |
datetime | 字符串值是否包含有效的 日期 | Field validate:"datetime" |
跳过字段
告诉验证跳过此结构字段;这尤其 方便忽略嵌入式结构进行验证。(用法: -)
Usage: -
必填
这将验证该值不是数据类型默认零值。 对于数字,确保值不为零。对于字符串确保值为 不是“”。用于切片、映射、指针、接口、通道和函数 确保该值不为零。
Usage: required
是默认值
这将验证该值是否为默认值,并且几乎是 与必需相反。
Usage: isdefau
长度
对于数字,长度将确保值为 等于给定的参数。对于字符串,它会检查 字符串长度正好是该字符数。对于切片, 数组和映射验证项目数。
示例 #1
Usage: len=10
最大
对于数字,max 将确保该值为 小于或等于给定的参数。对于字符串,它会检查 字符串长度最多为该字符数。为 切片、数组和映射验证项目数。
示例 #1
Usage: max=10
最低
对于数字,min 将确保该值为 大于或等于给定的参数。对于字符串,它会检查 字符串长度至少为该字符数。对于切片, 数组和映射验证项目数。
示例 #1
Usage: min=10
等于
对于字符串和数字,eq 将确保值为 等于给定的参数。对于切片、数组和映射, 验证项数。
示例 #1
Usage: eq=10
示例 #2(时间。持续时间)
为了时间。持续时间,eq 将确保该值等于给定的持续时间 在参数中。
Usage: eq=1h30m
不等于
对于字符串和数字,ne 将确保值不是 等于给定的参数。对于切片、数组和映射, 验证项数。
示例 #1
Usage: ne=10
不等于
对于字符串和数字,ne 将确保值不是 等于给定的参数。对于切片、数组和映射, 验证项数。
示例 #1
Usage: ne=10
大于
对于数字,这将确保该值大于 给出的参数。对于字符串,它检查字符串长度 大于该字符数。对于切片、数组 并映射它验证项目的数量。
示例 #1
Usage: gt=10
大于或等于
与上面的“min”相同。保留两者以使带有“len”的术语更容易。
示例 #1
Usage: gte=10
小于
对于数字,这将确保该值小于给定的参数。 对于字符串,它会检查字符串长度是否小于该数 字符。对于切片、数组和映射,它会验证项目数。
示例 #1
Usage: lt=10
小于或等于
与上面的“最大值”相同。保留两者以使带有“len”的术语更容易。
Usage: lte=10
独特
对于数组和切片,unique将确保没有重复项。 对于地图,唯一将确保没有重复值。 对于结构切片,unique 将确保没有重复值 在通过参数指定的结构的字段中。
// For arrays, slices, and maps: Usage: unique // For slices of struct: Usage: unique=field
数
这将验证字符串值是否仅包含数字值。 对于整数或浮点数,它返回 true。
Usage: number
数值的
这将验证字符串值是否包含基本数值。 基本排除指数等... 对于整数或浮点数,它返回 true。
Usage: numeric
小写字符串
这将验证字符串值是否仅包含小写字符。空字符串不是有效的小写字符串。
Usage: lowercase
大写字符串
这将验证字符串值是否仅包含大写字符。空字符串不是有效的大写字符串。
Usage: uppercase
电子邮件字符串
这将验证字符串值是否包含有效的电子邮件 这可能不符合任何 rfc 标准的所有可能性,但都不符合 是否有任何电子邮件提供商接受所有可能性。
Usage: email
JSON 字符串
这将验证字符串值是否有效 JSON
Usage: json
开头为
这将验证字符串值是否以提供的字符串值开头
Usage: startswith=hello
结尾为
这将验证字符串值是否以提供的字符串值结尾
Usage: endswith=goodbye
不以 开头
这将验证字符串值是否不以提供的字符串值开头
Usage: startsnotwith=hello
不以
这将验证字符串值是否不以提供的字符串值结尾
Usage: endsnotwith=goodbye
日期时间
这将根据提供的日期时间格式验证字符串值是否为有效的日期时间。 提供的格式必须与官方 Go 计时格式布局匹配,如 https://golang.org/pkg/time/ 中所述
Usage: datetime=2006-01-02
时区
这将验证字符串值是否为基于系统上存在的时区数据库的有效时区。 尽管空值和本地值是时间允许的。加载位置 golang 函数,此验证器不允许它们。 有关 https://golang.org/pkg/time/#LoadLocation 的更多信息
Usage: timezone
自定义
// 注册自定义验证函数
Deadline string json:"deadline" validate:"datetime=2006-01-02 15:04:05,required,customDeadlineValidator" //截止日期 validate.RegisterValidation("customDeadlineValidator", customDeadlineValidator)
/ 检查是否大于当前时间 func customDeadlineValidator(fl validator.FieldLevel) bool { if deadlineStr, ok := fl.Field().Interface().(string); ok { // 解析截止日期字符串为time.Time类型 deadline, err := time.Parse("2006-01-02 15:04:05", deadlineStr) if err != nil { return false } // 获取当前时间 currentTime := time.Now() // 比较截止日期与当前时间 if deadline.After(currentTime) { return true } } return false }