Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Validator 参数验证

Validator 简介

Validator 是基于 tag(标记)实现结构体和单个字段的值验证库,它包含以下功能:

  • 使用验证 tag(标记)或自定义验证器进行跨字段和跨结构体验证。
  • 关于 slice、数组和 map,允许验证多维字段的任何或所有级别。
  • 能够深入 map 键和值进行验证。
  • 通过在验证之前确定接口的基础类型来处理类型接口。
  • 处理自定义字段类型(如 sql 驱动程序 Valuer)。
  • 别名验证标记,它允许将多个验证映射到单个标记,以便更轻松地定义结构体上的验证。
  • 提取自定义的字段名称,例如,可以指定在验证时提取 JSON 名称,并在生成的 FieldError 中使用该名称。
  • 可自定义 i18n 错误消息。
  • Web 框架 gin 的默认验证器。

安装

1
go get github.com/go-playground/validator/v10

使用

单个变量验证

1
2
3
4
5
6
7
8
9
10
11
func main() {
validate := validator.New()
// 验证变量
email := "admin#admin.com"
err := validate.Var(email, "required,email")
if err != nil {
validationErrors := err.(validator.ValidationErrors)
fmt.Println(validationErrors)
return
}
}

结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func main() {
validate = validator.New()
type User struct {
ID int64 `json:"id" validate:"gt=0"`
Name string `json:"name" validate:"required"`
Gender string `json:"gender" validate:"required,oneof=man woman"`
Age uint8 `json:"age" validate:"required,gte=0,lte=130"`
Email string `json:"email" validate:"required,email"`
}
user := &User{
ID: 1,
Name: "frank",
Gender: "boy",
Age: 180,
Email: "gopher@88.com",
}
err = validate.Struct(user)
if err != nil {
validationErrors := err.(validator.ValidationErrors)
fmt.Println(validationErrors)
return
}
}

错误信息翻译为中文

安装翻译包

1
2
go get -u github.com/go-playground/locales
go get -u github.com/go-playground/universal-translator

导入

1
2
3
4
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zh_translations "github.com/go-playground/validator/v10/translations/zh"

使用

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
func main() {
// 实例化验证器
validate := validator.New()
type User struct {
ID int64 `json:"id" validate:"gt=0"`
Name string `json:"name" validate:"required"`
Gender string `json:"gender" validate:"required,oneof=man woman"`
Age uint8 `json:"age" validate:"required,gte=0,lte=130"`
Email string `json:"email" validate:"required,email"`
}
user := &User{
ID: 1,
Name: "frank",
Gender: "boy",
Age: 180,
Email: "gopher@88.com",
}
// 注册一个函数,获取结构体字段的备用名称
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return "j"
}
return name
})
// 中文翻译器
uni := ut.New(zh.New())
trans, _ := uni.GetTranslator("zh")
// 注册翻译器到校验器
_ = zh_translations.RegisterDefaultTranslations(validate, trans)

err := validate.Struct(user)
if err != nil {
for _, err := range err.(validator.ValidationErrors) {
// 错误翻译
fmt.Println(err.Translate(trans))
}
}
}

评论