Skip to content

内置校验器

govalid 在全局 Checkers map 中注册了 17 个校验器。每个校验器都接受 相同的 CheckerContext,失败时返回 *ErrContext

空字符串短路

格式型校验器(alphaalphanumericalphadashusernameemailipv4mobiletelphoneidcard)会把空字符串视为 有效。结合 required 即可拒绝空输入。这让"可选字段"的建模变 得非常自然。

存在性

required

字段必须不是其零值/空值。

类型失败条件
stringslicearraymapchan长度为 0
pointerinterfacefunc值为 nil
其他可比较类型值等于零值
不可比较的 struct跳过(不会 panic)
go
type Form struct {
    Name string            `valid:"required"`
    Tags []string          `valid:"required"`
    Cfg  *Config           `valid:"required"`
    Meta map[string]string `valid:"required"`
}

数值范围

min:N

字段必须 >= N。支持有符号整型、无符号整型和浮点数。

go
type Form struct {
    Age   uint    `valid:"min:18"`
    Score float64 `valid:"min:0"`
}

max:N

字段必须 <= N。支持有符号整型、无符号整型和浮点数。

go
type Form struct {
    Age uint `valid:"min:18;max:120"`
}

WARNING

NaN 既不会触发 min 也不会触发 max,因为 IEEE 754 NaN 比较结果 始终为假。如果你的领域里这点很重要,请用自定义校验器显式拒绝。

长度

minlen:N

长度 >= N。字符串按 rune 计数(所以 "中文" 长度为 2)。 支持 stringslicearraymap

maxlen:N

长度 <= N

go
type Comment struct {
    Body string   `valid:"minlen:1;maxlen:280"`
    Tags []string `valid:"maxlen:5"`
}

字符串

alpha

仅 ASCII 字母(a-zA-Z)。

alphanumeric

ASCII 字母或数字。

alphadash

字母、数字或下划线(\w+)。注意 - 包含在内。

username

alphadash 加上两条额外规则:

  1. 第一个字符(rune)必须是 ASCII 字母。
  2. 最后一个字符不能是 _
go
type Form struct {
    Username string `valid:"required;username;minlen:3;maxlen:20"`
}

格式

email

电子邮箱地址。允许 +tag 寻址、带点的本地部分、多级域名。

ipv4

点分四段 IPv4 地址(0.0.0.0255.255.255.255)。

mobile

中国手机号。可选的 +8686 国家前缀。模式以 MobilePattern 名称导出,需要时可替换。

tel

中国座机号。可选的区号,可选的 -

phone

mobiletel 之一。两者都失败时返回专用的 phone 错误模板, 而不是底层的 mobile/tel

idcard

中国居民身份证号:15 位数字,或 17 位数字 + 1 位末校验位(0-9Xx)。

go
type Profile struct {
    Email   string `valid:"email"`
    HomeIP  string `valid:"ipv4"`
    Mobile  string `valid:"required;mobile"`
    IDCard  string `valid:"idcard"`
}

跨字段

equal:OtherField

字符串化的值必须与外层 struct 的另一个字段相等。被比较的字段以 Go 字段名引用,而不是它的 label。

go
type Form struct {
    Password       string `valid:"required;minlen:8" label:"密码"`
    RepeatPassword string `valid:"equal:Password"   label:"重复密码"`
}

如果引用的字段不存在,规则会失败并返回 字段不存在 错误,而不会 默默通过。

枚举

list:a,b,c

字符串化的字段值必须是逗号分隔的允许值之一。所有类型都支持,因为 比较时会用 fmt.Sprintf("%v", value)

go
type User struct {
    Role string `valid:"list:admin,editor,viewer"`
}

TIP

由于 list 会字符串化值,你也可以用在数字、布尔甚至自定义类型上, 只要它们的 %v 表示稳定即可:

go
type Settings struct {
    Verbosity int `valid:"list:0,1,2,3"`
}

总览表

规则参数适用类型空字符串短路
required任意
min:N一个数字int / uint / float
max:N一个数字int / uint / float
minlen:N一个 intstring / slice / array / map
maxlen:N一个 intstring / slice / array / map
alphastring
alphanumericstring
alphadashstring
usernamestring
emailstring
ipv4string
mobilestring
telstring
phonestring
idcardstring
equal:Field一个字段名任意
list:a,b,c一个或多个值任意(字符串化)

需要别的能力?看 自定义校验器

基于 MIT 协议发布。