详解Go工具库go-playground/validator在Gin框架中的使用教程

在Go语言的Web开发中,Gin框架因其高性能和易用性而广受欢迎。然而,处理请求参数的验证是一个常见的需求。go-playground/validator是一个功能强大的验证库,可以与Gin框架无缝集成,帮助开发者轻松实现请求参数的验证。

本教程将详细介绍如何在Gin框架中使用go-playground/validator,并通过多个示例展示其用法。

安装

首先,确保你已经安装了Gin和go-playground/validator库。如果没有,可以使用以下命令进行安装:

go get -u github.com/gin-gonic/gin
go get -u github.com/go-playground/validator/v10

基本使用

示例1:简单的字符串验证

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type User struct {
    Name string `json:"name" binding:"required,min=3,max=10"`
    Age  int    `json:"age" binding:"required,gte=18,lte=60"`
}

func main() {
    router := gin.Default()

    router.POST("/user", func(c *gin.Context) {
        var user User
        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"message": "User is valid!"})
    })

    router.Run(":8080")
}

代码注解:

  • User结构体中定义了两个字段:NameAge
  • Name字段通过binding:"required,min=3,max=10"标签指定了验证规则:必填,长度在3到10之间。
  • Age字段通过binding:"required,gte=18,lte=60"标签指定了验证规则:必填,值在18到60之间。
  • c.ShouldBindJSON(&user)用于将请求的JSON数据绑定到User结构体,并自动进行验证。

示例2:自定义验证函数

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
    "net/http"
)

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

func validateEmail(fl validator.FieldLevel) bool {
    email := fl.Field().String()
    // 自定义邮箱验证逻辑
    return len(email) > 5 && len(email) < 50
}

func main() {
    router := gin.Default()

    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
        v.RegisterValidation("email", validateEmail)
    }

    router.POST("/user", func(c *gin.Context) {
        var user User
        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"message": "User is valid!"})
    })

    router.Run(":8080")
}

代码注解:

  • validateEmail函数是一个自定义的验证函数,用于验证邮箱地址的长度。
  • v.RegisterValidation("email", validateEmail)将自定义验证函数注册到验证器中,并命名为email
  • Email字段通过binding:"required,email"标签指定了验证规则:必填,并使用自定义的邮箱验证函数。

示例3:嵌套结构体的验证

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type Address struct {
    City    string `json:"city" binding:"required"`
    Country string `json:"country" binding:"required"`
}

type User struct {
    Name    string  `json:"name" binding:"required,min=3,max=10"`
    Age     int     `json:"age" binding:"required,gte=18,lte=60"`
    Address Address `json:"address" binding:"required"`
}

func main() {
    router := gin.Default()

    router.POST("/user", func(c *gin.Context) {
        var user User
        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"message": "User is valid!"})
    })

    router.Run(":8080")
}

代码注解:

  • Address结构体嵌套在User结构体中,用于表示用户的地址信息。
  • Address结构体的字段通过binding:"required"标签指定了验证规则:必填。
  • User结构体的Address字段通过binding:"required"标签指定了验证规则:必填。

示例4:使用多个验证规则

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type User struct {
    Name  string `json:"name" binding:"required,min=3,max=10"`
    Age   int    `json:"age" binding:"required,gte=18,lte=60"`
    Email string `json:"email" binding:"required,email"`
    Phone string `json:"phone" binding:"required,len=11"`
}

func main() {
    router := gin.Default()

    router.POST("/user", func(c *gin.Context) {
        var user User
        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"message": "User is valid!"})
    })

    router.Run(":8080")
}

代码注解:

  • Phone字段通过binding:"required,len=11"标签指定了验证规则:必填,长度必须为11。
  • 通过组合不同的验证规则,可以实现更复杂的验证逻辑。

go-playground/validator 默认支持的参数、验证方式、比较参数

1. 常用验证参数

  • required:字段必填。
  • omitempty:字段可以为空。
  • min:最小值(适用于数字、字符串长度)。
  • max:最大值(适用于数字、字符串长度)。
  • len:固定长度(适用于字符串、数组、切片)。
  • eq:等于某个值。
  • ne:不等于某个值。
  • gt:大于某个值。
  • gte:大于等于某个值。
  • lt:小于某个值。
  • lte:小于等于某个值。

2. 常用验证方式

  • email:验证邮箱格式。
  • url:验证URL格式。
  • uuid:验证UUID格式。
  • alpha:验证字符串是否只包含字母。
  • alphanum:验证字符串是否只包含字母和数字。
  • numeric:验证字符串是否只包含数字。
  • hexadecimal:验证字符串是否为十六进制格式。
  • hexcolor:验证字符串是否为十六进制颜色格式。
  • rgb:验证字符串是否为RGB颜色格式。
  • rgba:验证字符串是否为RGBA颜色格式。
  • hsl:验证字符串是否为HSL颜色格式。
  • hsla:验证字符串是否为HSLA颜色格式。
  • ip:验证字符串是否为IP地址格式。
  • ipv4:验证字符串是否为IPv4地址格式。
  • ipv6:验证字符串是否为IPv6地址格式。
  • cidr:验证字符串是否为CIDR格式。
  • cidrv4:验证字符串是否为CIDRv4格式。
  • cidrv6:验证字符串是否为CIDRv6格式。
  • tcp_addr:验证字符串是否为TCP地址格式。
  • tcp4_addr:验证字符串是否为TCPv4地址格式。
  • tcp6_addr:验证字符串是否为TCPv6地址格式。
  • udp_addr:验证字符串是否为UDP地址格式。
  • udp4_addr:验证字符串是否为UDPv4地址格式。
  • udp6_addr:验证字符串是否为UDPv6地址格式。
  • ip_addr:验证字符串是否为IP地址格式。
  • ip4_addr:验证字符串是否为IPv4地址格式。
  • ip6_addr:验证字符串是否为IPv6地址格式。
  • unix_addr:验证字符串是否为Unix地址格式。
  • mac:验证字符串是否为MAC地址格式。
  • isbn:验证字符串是否为ISBN格式。
  • isbn10:验证字符串是否为ISBN-10格式。
  • isbn13:验证字符串是否为ISBN-13格式。
  • eth_addr:验证字符串是否为以太网地址格式。
  • btc_addr:验证字符串是否为比特币地址格式。
  • btc_addr_bech32:验证字符串是否为比特币Bech32地址格式。
  • base64:验证字符串是否为Base64编码格式。
  • base64url:验证字符串是否为Base64 URL编码格式。
  • ascii:验证字符串是否只包含ASCII字符。
  • printascii:验证字符串是否只包含可打印的ASCII字符。
  • multibyte:验证字符串是否包含多字节字符。
  • datauri:验证字符串是否为Data URI格式。
  • latitude:验证字符串是否为纬度格式。
  • longitude:验证字符串是否为经度格式。
  • ssn:验证字符串是否为社会安全号码(SSN)格式。
  • hostname:验证字符串是否为主机名格式。
  • lowercase:验证字符串是否为小写。
  • uppercase:验证字符串是否为大写。
  • unique:验证切片或数组中的元素是否唯一。
  • oneof:验证字段是否为一组预定义值之一。

3. 常用比较参数

  • eqfield:验证字段是否等于另一个字段。
  • nefield:验证字段是否不等于另一个字段。
  • gtfield:验证字段是否大于另一个字段。
  • gtefield:验证字段是否大于等于另一个字段。
  • ltfield:验证字段是否小于另一个字段。
  • ltefield:验证字段是否小于等于另一个字段。
  • eqcsfield:验证字段是否等于另一个结构体中的字段。
  • necsfield:验证字段是否不等于另一个结构体中的字段。
  • gtcsfield:验证字段是否大于另一个结构体中的字段。
  • gtecsfield:验证字段是否大于等于另一个结构体中的字段。
  • ltcsfield:验证字段是否小于另一个结构体中的字段。
  • ltecsfield:验证字段是否小于等于另一个结构体中的字段。

通过这些验证参数、验证方式和比较参数,开发者可以灵活地定义和组合验证规则,以满足各种复杂的验证需求。

标签: Go

相关文章

在 Go 项目中使用 LevelDB 进行数据存储

LevelDB 是一个由 Google 开发的高性能键值存储库,广泛应用于需要快速读写操作的场景。本文将介绍如何在 Go 项目中使用 LevelDB 作为数据存储,并通过示例代码展示如何初始化数...

详解Go语言依赖注入工具wire最佳实践介绍与使用

wire是一个强大的依赖注入工具,通过代码生成的方式实现了高效的依赖注入。本文详细介绍了wire的入门级和高级使用技巧,并通过示例代码展示了其强大的功能。无论是简单的依赖注入,还是复杂的依赖图生...

Go语言中copy命令讲解 切片之间复制元素

在Go语言中,copy函数是一个非常常用的内置函数,用于在切片(slice)之间复制元素。理解copy函数的用法和机制对于高效处理数据操作至关重要1. copy函数的基本用法copy函数的基本语...

深入理解 Go 语言中的 goto:用法与最佳实践

在学习编程语言时,goto 一直是一个颇具争议的概念。它常常因为“跳跃式”的行为被认为会让代码混乱且难以维护,但在 Go 语言中,goto 被保留并提供了一些实际的应用场景。今天我们将深入探讨 ...

Go并发编程与调度器及并发模式详解

Go语言以其简洁的语法和强大的并发能力,成为现代网络编程和微服务架构的热门选择。本文将深入探讨Go的并发编程模型,调度器的工作机制,以及多种并发模式的实现和应用,帮助开发者更好地理解并发编程的设...

Go语言中sync.Pool详解

sync.Pool 是 Go 语言标准库中的一个数据结构,用于提供高效的对象池。它的主要作用是缓存临时对象,以减少内存分配和垃圾回收的开销。sync.Pool 特别适合用于存储短生命周期的对象,...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件