Golang使用 go-playground/validator/v10 校验结构体字段
- 安装
go get github.com/go-playground/validator/v10
- 基础示例
package main import ( "fmt" "github.com/go-playground/validator/v10" ) type User struct { Name string `validate:"required"` } func main() { user := User{ Name: "张三", } validate := validator.New() err := validate.Struct(user) if err != nil { // 处理验证错误 fmt.Println(err.Error()) return } fmt.Println("校验通过") }
- 标签基本规则
逗号(,): 把多个验证标记分开,中间不能有空格,会从左到右按标记验证。 横线(-): 忽略该字段。 竖线(|): 把多个验证标记分开,只要满足其中一个即可。
- 常用标签
1.通用校验
required: 不能为字段类型的零值。 omitempty: 如果字段为类型零值,则不应用校验规则,只影响排在它右边的验证规则。2.字符串校验
min=n: 最小长度n max=n: 最大长度n len=n: 固定长度n alpha: 仅字母(A-Z和a-z)组成 alphanum: 仅字母和数字字符组成 numeric: 纯数字字符组成 email: 有效的邮箱格式 url: 有效的url格式 uuid: 有效的uuid格式 datetime=f: 符合f格式的字符串时间,比如2006-01-02 eq=v: 等于v,不需要加引号 ne=v: 不等于v,不需要加引号 oneof=a b c: 必须是a、b、c中的一个,不需要加引号 contains=v: 字符串包含v excludes=v: 字符串不包含v startswith=v: 字符串以v开头 endswith=v: 字符串以v结尾
3.数值校验
gt=n: 大于n gte=n: 大于等于n lt=n: 小于n lte=n: 小于等于n eq=n: 等于n ne=n: 不等于n oneof=a b c: 必须是a、b、c中的一个
4.切片校验
min=n: 切片最小长度n max=n: 切片最大长度n len=n: 切片固定长度n unique: 切片中的元素不能重复(数组也可用)
5.映射(map)校验
keys,endkeys 使用规则: keys,[键验证规则],endkeys,[值验证规则]。需要配合dive开启深度校验。 比如: dive,keys,min=1,max=100,endkeys,required,min=1,max=100
6.深度校验
dive: 开启深度校验 使用规则: 遇到切片、数组、映射时,需要使用dive开启深度校验。 举例: - "[]string"类型字段校验: validate:"required,dive,min=2",表示切片内字符串的长度不能小于2。 - "[]结构体"类型字段校验: validate:"required,dive", 切片内结构体的字段上设置的校验标签会被执行。 - map类型字段校验: 参考前面的映射校验 注意: 对于结构体嵌套,不需要加dive,会自动执行子结构体字段设置的校验规则。 如果子结构体定义了校验规则,但是不希望这些规则执行,那么在父结构体的相应字段上添加binding:"structonly"标签即可。
7.同结构体跨字段校验
eqfield=同结构体字段名: 表示当前字段值要与指定的字段值相等。 nefield=同结构体字段名: 表示当前字段值要与指定的字段值不相等。 gtefield=同结构体字段名: 表示当前字段值要大于等于指定字段值。 ltefield=同结构体字段名: 表示当前字段值要小于等于指定字段值。
浙公网安备 33010602011771号