golang,go,博客,开源,编程

golang每日一库之go-playground/validator/v10

Published on with 0 views and 0 comments

go-playground/validator/v10 是一个用于 Go 语言的开源库,主要用于数据验证。它提供了一个简单而强大的机制,用于验证结构体中的字段是否符合预定的规则,常用于 Web 应用的表单验证、API 请求验证等场景。

该库支持多种常见的验证规则,并允许自定义验证规则。validator/v10 在 Go 社区中非常受欢迎,因其高效、灵活、易于使用的特性。

核心特性:

  1. 内置验证规则
    • validator/v10 提供了大量的内置验证规则,例如验证字段是否为有效的电子邮件、手机号、UUID、URL,或者验证字段值是否符合某个范围等。
  2. 结构体验证
    • 可以对 Go 语言中的结构体字段进行验证,支持嵌套结构体和数组、切片、映射等复杂类型的验证。
  3. 标签支持(Struct Tags)
    • 通过使用结构体标签(struct tags),可以非常简便地为结构体字段指定验证规则,类似于常见的 JSON 和数据库标签。
  4. 自定义验证规则
    • 如果内置的验证规则不符合需求,validator/v10 允许用户定义自定义验证规则。
  5. 嵌套结构体支持
    • 支持对嵌套结构体字段的验证,可以递归地验证深层结构体中的字段。
  6. 错误处理
    • 提供详细的错误信息,验证失败时可以获取验证失败的字段和原因。
  7. 性能
    • validator/v10 在设计时优化了性能,尤其适合高并发的环境。
  8. 支持条件验证
    • 可以在特定条件下执行验证,如基于某些字段的值进行验证。
  9. 链式验证
    • 支持多个验证规则链式使用,支持 ANDOR 等逻辑。

安装:

可以通过 go get 安装 validator/v10

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

基本用法:

以下是一个简单的示例,展示了如何使用 validator/v10 来验证结构体中的字段。

package main

import (
    "fmt"
    "github.com/go-playground/validator/v10"
)

type User struct {
    Name     string `json:"name" validate:"required,min=3,max=100"`
    Age      int    `json:"age" validate:"required,gte=18,lte=100"`
    Email    string `json:"email" validate:"required,email"`
}

func main() {
    validate := validator.New()

    user := User{
        Name:  "John",
        Age:   25,
        Email: "john.doe@example.com",
    }

    // 验证结构体
    err := validate.Struct(user)
    if err != nil {
        // 如果验证失败,打印错误信息
        for _, err := range err.(validator.ValidationErrors) {
            fmt.Println("字段", err.Field(), "验证失败,原因:", err.Tag())
        }
    } else {
        fmt.Println("验证通过!")
    }
}

验证标签(Struct Tags):

validator/v10 使用 Go 的结构体标签来指定字段的验证规则。常见的验证规则有:

  • required:字段不能为空。
  • min:字段值的最小长度或最小值。
  • max:字段值的最大长度或最大值。
  • email:验证字段值是否为有效的电子邮件。
  • url:验证字段值是否为有效的 URL。
  • gte(greater than or equal):验证字段值是否大于或等于某个值。
  • lte(less than or equal):验证字段值是否小于或等于某个值。
  • len:验证字段值的长度。
  • alpha:验证字段值是否仅包含字母。

示例:

type Product struct {
    Name        string  `validate:"required,min=3,max=100"`
    Price       float64 `validate:"required,gte=0"`
    Description string  `validate:"omitempty,max=500"`
}

常见的验证规则:

  • required:字段必须有值。
  • email:字段必须是有效的电子邮件地址。
  • url:字段必须是有效的 URL。
  • min=3:字段值最小长度为 3。
  • max=10:字段值最大长度为 10。
  • gte=0:字段值大于或等于 0。
  • lte=100:字段值小于或等于 100。
  • alpha:字段值只允许包含字母字符。
  • alphanum:字段值只允许包含字母和数字。

自定义验证规则:

validator/v10 允许定义自定义验证规则。例如,你可以为某个字段定义一个自定义的验证器,以验证某些特定条件。

import "github.com/go-playground/validator/v10"

// 自定义验证函数
func isEven(fl validator.FieldLevel) bool {
    return fl.Field().Int()%2 == 0
}

func main() {
    validate := validator.New()

    // 注册自定义验证函数
    validate.RegisterValidation("even", isEven)

    // 测试结构体
    type MyStruct struct {
        Number int `validate:"even"`
    }

    test := MyStruct{
        Number: 2,
    }

    err := validate.Struct(test)
    if err != nil {
        fmt.Println("验证失败:", err)
    } else {
        fmt.Println("验证通过!")
    }
}

嵌套结构体验证:

validator/v10 支持嵌套结构体的验证。如果结构体字段是另一个结构体,validator 会递归地验证子结构体中的字段。

type Address struct {
    Street string `validate:"required"`
    City   string `validate:"required"`
}

type User struct {
    Name    string  `validate:"required"`
    Address Address `validate:"required"`
}

func main() {
    user := User{
        Name: "John",
        Address: Address{
            Street: "123 Main St",
            City:   "New York",
        },
    }

    validate := validator.New()
    err := validate.Struct(user)
    if err != nil {
        fmt.Println("验证失败:", err)
    } else {
        fmt.Println("验证通过!")
    }
}

错误处理:

验证失败时,validator/v10 会返回一个 ValidationErrors 类型的错误,包含了所有验证失败的字段和原因。

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

总结:

  • go-playground/validator/v10 是一个功能丰富的 Go 语言验证库,广泛应用于 Web 应用、API 请求和表单验证等场景。
  • 支持丰富的内置验证规则和自定义规则,且通过结构体标签轻松配置验证规则。
  • 支持嵌套结构体验证,适用于复杂的数据结构。
  • 提供了清晰的错误信息,便于调试和用户反馈。

标题:golang每日一库之go-playground/validator/v10
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/17/1737096892820.html
联系:scotttu@163.com