2025-09-30
Go
00

目录

第一部分 概述
1.1 主要功能和作用:
1.2 常见使用场景
第二部分 常用操作
2.1 安装 validator 库
2.2 简单的字段验证
2.3 常见验证标签
2.4 自定义验证函数
2.5 验证嵌套结构体
2.6 错误信息处理
2.7 批量验证

第一部分 概述

validator 是 Go 语言中的一个库,用于对结构体进行数据验证,常用于 Web 开发和表单数据的校验。它提供了灵活且易于扩展的功能,可以帮助开发者轻松地验证用户输入的数据是否符合预定的规则。该库遵循声明式验证的方式,能够通过标签(tag)来指定每个字段的验证规则。validator 可以广泛应用于表单验证、API 参数验证、用户输入验证等场景。

项目地址:https://github.com/go-playground/validator

1.1 主要功能和作用:

  • 字段验证:可以为结构体中的字段添加验证规则(通过标签),例如,验证是否为空、是否为有效的电子邮件地址、是否符合特定的最小或最大长度等。
  • 自定义验证:支持自定义验证规则,可以通过注册自定义函数来扩展验证逻辑。
  • 多种常见验证器:提供了多种内置的常见验证器,如 requiredminmaxemaillen 等,满足大多数验证需求。
  • 链式验证:支持多个验证规则叠加使用,允许开发者为字段指定多个验证条件,验证规则之间通过 , 进行分隔。
  • 嵌套验证:支持结构体嵌套,可以对嵌套结构体中的字段进行验证,并且能够递归地进行验证。
  • 错误信息:当验证失败时,validator 会返回具体的错误信息,帮助开发者快速定位问题。

1.2 常见使用场景

  • Web 表单验证:在 Web 开发中,用户提交的表单数据需要验证是否合法,validator 可以帮助开发者轻松实现表单字段验证(如用户名、密码、电子邮件等)。
  • API 参数验证:对于接收到的请求参数,validator 可以用于验证 API 请求的数据是否符合预期的格式和要求。
  • 用户输入验证:用于验证用户在注册、登录或修改个人信息时提交的数据,确保数据的有效性和安全性。
  • 数据库字段验证:可以对数据库模型的字段进行验证,确保数据符合要求再进行数据库操作。

第二部分 常用操作

2.1 安装 validator

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

2.2 简单的字段验证

使用 validator 库最常见的方式是给结构体字段添加标签,并使用 Validate 方法进行验证:

go
package 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 结构体的 NameEmailAge 字段上都添加了验证标签。

  • validate:"required" 表示该字段为必填
  • min=3max=100 分别表示字符串的最小和最大长度
  • gte=18 表示年龄必须大于或等于 18

2.3 常见验证标签

validator 提供了许多常用的验证标签,用于验证字段是否符合特定要求。以下是一些常见的验证标签:

  • required:字段不能为空
  • min=X:验证字段的最小值(适用于数字、字符串等)
  • max=X:验证字段的最大值
  • len=X:验证字段的长度
  • gte=X:验证字段是否大于等于 X
  • lte=X:验证字段是否小于等于 X
  • url:验证字段是否为有效的 URL
  • uuid:验证字段是否为有效的 UUID

例如,验证邮箱字段和年龄字段:

go
type User struct { Email string `json:"email" validate:"required,email"` Age int `json:"age" validate:"gte=18,lte=100"` }

2.4 自定义验证函数

validator 允许开发者注册自定义的验证规则,可以通过 RegisterValidation 方法来实现:

go
package 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 字段上。

2.5 验证嵌套结构体

validator 支持对嵌套结构体进行递归验证。如果结构体字段本身是一个结构体,也会进行验证:

go
package 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 结构体,并且我们为 AddressUser 字段都设置了验证规则。当 Street 字段为空时,验证会失败。

2.6 错误信息处理

validator 会返回详细的验证错误信息,可以通过 ValidationErrors 类型获取验证失败的字段和错误信息:

go
err := validate.Struct(user) if err != nil { for _, err := range err.(validator.ValidationErrors) { fmt.Printf("字段 %s 验证失败: %s\n", err.StructField(), err.Tag()) } }

2.7 批量验证

可以一次性验证多个结构体或多个字段,validator 会返回一个包含所有错误的列表:

go
err := validate.StructMany([]interface{}{user1, user2, user3})
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:蒋固金

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!