GoLang gin validator 字段校验

1
2
3
4
// 下载
go get github.com/go-playground/validator/v10
// 使用
import "github.com/go-playground/validator/v10"

简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

type User struct {
Name string `binding:"required" validate:"isName,min=6,max=10"`
Age uint8 `binding:"required" validate:"gte=1,lte=10"`
Sex string `binding:"required" validate:"oneof=female male"`
Email string `binding:"required" validate:"email"`
}

// 自定义验证规则断言
func isName(fl validator.FieldLevel) bool {
if name, ok := fl.Field().Interface().(string); ok {
return len(strings.Split(name, " ")) >= 2
}
return true
}

func main() {
validate := validator.New()
user := User{Name: "ifan lw", Age: 11}
validate.RegisterValidation("isName", isName)
err := validate.Struct(user)
if err != nil {
fmt.Println("校验错误", err)
}
}

字段校验规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
len:length 等于,长度相等
max:小于等于
min:大于等于
eq:等于,字符串相等
ne:不等于
gt:大于
gte:大于等于
lt:小于
lte:小于等于,例如lte=10;
oneof:值中的一个,例如oneof=1 2

支持时间范围的比较lte
时间 RegTime time.Time `validate:"lte"` 小于等于当前时间

跨字段约束
eqfield=ConfirmPassword
eqcsfield=InnerStructField.Field

字符串规则
contains=:包含参数子串
containsany:包含参数中任意的 UNICODE 字符
containsrune:包含参数表示的 rune 字符
excludes:不包含参数子串
excludesall:不包含参数中任意的 UNICODE 字符
excludesrune:不包含参数表示的 rune 字符
startswith:以参数子串为前缀
endswith:以参数子串为后缀

使用unqiue来指定唯一性约束,对不同类型的处理如下:

对于数组和切片,unique约束没有重复的元素;
对于map,unique约束没有重复的值;
对于元素类型为结构体的切片,unique约束结构体对象的某个字段不重复,通过unqiue=name

特殊规则

-:跳过该字段,不检验;
|:使用多个约束,只需要满足其中一个,例如rgb|rgba;
required:字段必须设置,不能为默认值;
omitempty:如果字段未设置,则忽略它。