Go 语言中,结构体验证是保障数据完整性和正确性的重要手段之一。本文将深入探讨 validate
标签的使用方式,并介绍如何结合验证库 go-playground/validator 进行自定义验证规则。
首先,请确保已安装验证库:
go get -u github.com/go-playground/validator/v10
在代码中导入验证库:
import "github.com/go-playground/validator/v10"
使用 validate
标签为结构体字段定义基本验证规则:
- type User struct {
- Username string `validate:"required,min=3,max=20"`
- Email string `validate:"required,email"`
- Age int `validate:"gte=18"`
- }
在上述示例中:
required
表示字段值不能为空。min=3
和 max=20
表示字符串长度必须在 3 到 20 之间。email
要求字段值是有效的电子邮件地址。gte=18
表示数字字段必须大于等于 18。为了满足特定业务需求,我们可以定义自己的验证规则。首先,创建一个自定义验证函数:
- func customRule(fl validator.FieldLevel) bool {
- // 自定义验证逻辑,返回 true 表示验证通过,false 表示验证失败
- value := fl.Field().String()
- return value == "custom_value"
- }
然后,在结构体字段的 validate
标签中引用这个函数:
- type MyStruct struct {
- CustomField string `validate:"customRule"`
- }
验证库支持嵌套结构体的验证。例如,如果有一个嵌套的 Address
结构体:
- type User struct {
- Username string `validate:"required"`
- Email string `validate:"required,email"`
- Address Address `validate:"required"`
- }
-
- type Address struct {
- Street string `validate:"required"`
- City string `validate:"required"`
- }
在这个例子中,Address
结构体的验证规则会被嵌套到 User
结构体的验证中。
对于切片和数组,我们可以使用 dive
标签进行元素级别的验证:
- type MyStruct struct {
- Numbers []int `validate:"required,dive,gte=0,lte=100"`
- }
这表示 Numbers
切片中的每个元素必须在 0 到 100 之间。
我们可以为每个验证规则定义自定义的错误消息:
- type User struct {
- Username string `validate:"required,min=3,max=20" error:"用户名不能为空,长度必须在3到20之间"`
- }
在这个例子中,如果验证失败,将使用自定义的错误消息而不是默认的错误消息。
创建验证器实例,使用其 Struct
方法进行结构体验证:
- func main() {
- validate := validator.New()
-
- user := User{
- Username: "john_doe",
- Email: "john@example.com",
- Address: Address{
- Street: "123 Main St",
- City: "Anytown",
- },
- }
-
- if err := validate.Struct(user); err != nil {
- // 处理验证错误
- for _, err := range err.(validator.ValidationErrors) {
- fmt.Println(err.Field(), err.Tag(), err.Param(), err.ActualTag(), err.Namespace())
- }
- return
- }
-
- fmt.Println("Validation passed!")
- }
在验证失败时,我们可以获取每个字段的详细错误信息,进行进一步的处理。
通过 validate
标签与验证库的结合,我们可以方便地定义和执行验证规则,确保数据的完整性和正确性。自定义验证规则、嵌套结构体验证、切片和数组元素验证等功能为开发者提供了更多灵活性,让结构体验证更加强大。