validator
是 Go 语言中的一个库,用于对结构体进行数据验证,常用于 Web 开发和表单数据的校验。它提供了灵活且易于扩展的功能,可以帮助开发者轻松地验证用户输入的数据是否符合预定的规则。该库遵循声明式验证的方式,能够通过标签(tag)来指定每个字段的验证规则。validator
可以广泛应用于表单验证、API 参数验证、用户输入验证等场景。
项目地址:https://github.com/go-playground/validator
required
、min
、max
、email
、len
等,满足大多数验证需求。,
进行分隔。validator
会返回具体的错误信息,帮助开发者快速定位问题。validator
可以帮助开发者轻松实现表单字段验证(如用户名、密码、电子邮件等)。validator
可以用于验证 API 请求的数据是否符合预期的格式和要求。validator
库bashgo get github.com/go-playground/validator/v10
使用 validator
库最常见的方式是给结构体字段添加标签,并使用 Validate
方法进行验证:
gopackage main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type User struct {
Name string `json:"name" validate:"required,min=3,max=100"`
Email string `json:"email" validate:"required,email"`
Age int `json:"age" validate:"gte=18"`
}
func main() {
user := &User{
Name: "John",
Email: "john.doe@example.com",
Age: 25,
}
validate := validator.New()
// 验证结构体
err := validate.Struct(user)
if err != nil {
// 如果验证失败,打印错误信息
for _, err := range err.(validator.ValidationErrors) {
fmt.Println("验证失败:", err)
}
} else {
fmt.Println("验证通过")
}
}
在上述代码中,User
结构体的 Name
、Email
和 Age
字段上都添加了验证标签。
validate:"required"
表示该字段为必填min=3
和 max=100
分别表示字符串的最小和最大长度gte=18
表示年龄必须大于或等于 18validator
提供了许多常用的验证标签,用于验证字段是否符合特定要求。以下是一些常见的验证标签:
required
:字段不能为空min=X
:验证字段的最小值(适用于数字、字符串等)max=X
:验证字段的最大值len=X
:验证字段的长度gte=X
:验证字段是否大于等于 Xlte=X
:验证字段是否小于等于 Xurl
:验证字段是否为有效的 URLuuid
:验证字段是否为有效的 UUID例如,验证邮箱字段和年龄字段:
gotype User struct {
Email string `json:"email" validate:"required,email"`
Age int `json:"age" validate:"gte=18,lte=100"`
}
validator
允许开发者注册自定义的验证规则,可以通过 RegisterValidation
方法来实现:
gopackage main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
func main() {
validate := validator.New()
// 注册自定义验证函数
validate.RegisterValidation("even", func(fl validator.FieldLevel) bool {
return fl.Field().Int()%2 == 0
})
type Product struct {
Code int `json:"code" validate:"even"`
}
product := Product{
Code: 123,
}
err := validate.Struct(product)
if err != nil {
fmt.Println("验证失败:", err)
} else {
fmt.Println("验证通过")
}
}
在这个例子中,我们自定义了一个验证函数 even
,它检查一个字段值是否为偶数。我们将其应用到 Product
结构体的 Code
字段上。
validator
支持对嵌套结构体进行递归验证。如果结构体字段本身是一个结构体,也会进行验证:
gopackage main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type Address struct {
Street string `validate:"required"`
City string `validate:"required"`
}
type User struct {
Name string `validate:"required"`
Address Address `validate:"required"`
}
func main() {
validate := validator.New()
user := &User{
Name: "John",
Address: Address{
Street: "",
City: "New York",
},
}
err := validate.Struct(user)
if err != nil {
fmt.Println("验证失败:", err)
} else {
fmt.Println("验证通过")
}
}
在这个例子中,User
结构体嵌套了 Address
结构体,并且我们为 Address
和 User
字段都设置了验证规则。当 Street
字段为空时,验证会失败。
validator
会返回详细的验证错误信息,可以通过 ValidationErrors
类型获取验证失败的字段和错误信息:
goerr := validate.Struct(user)
if err != nil {
for _, err := range err.(validator.ValidationErrors) {
fmt.Printf("字段 %s 验证失败: %s\n", err.StructField(), err.Tag())
}
}
可以一次性验证多个结构体或多个字段,validator
会返回一个包含所有错误的列表:
goerr := validate.StructMany([]interface{}{user1, user2, user3})
本文作者:蒋固金
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!