Go 语言中一个功能强大且广泛使用的数据验证库github.com/go-playground/validator/v10

github.com/go-playground/validator/v10 是 Go 语言中一个功能强大且广泛使用的数据验证库,主要用于对结构体字段进行数据校验,确保数据的合法性和完整性。以下是其核心作用、使用场景及代码案例的详细说明:


核心作用

  1. 数据校验
    支持对结构体字段的多种校验规则(如必填、长度、范围、格式等),避免无效或恶意数据进入系统。
  2. 减少重复代码
    通过标签(Tag)定义校验规则,避免手动编写大量校验逻辑。
  3. 支持嵌套和复杂结构
    可校验嵌套结构体、切片、映射等复杂数据类型。
  4. 自定义校验规则
    允许开发者注册自定义校验函数,满足特定业务需求。
  5. 国际化支持
    支持多语言错误消息,便于国际化应用。

使用场景

  1. API 请求参数校验
    在处理 HTTP 请求时,校验用户输入的数据(如注册表单、登录参数等)。
  2. 配置文件校验
    验证配置文件中的参数是否符合预期格式。
  3. 数据库操作前校验
    在将数据存入数据库前,确保数据的合法性。
  4. 表单提交校验
    在 Web 或 CLI 应用中,校验用户提交的表单数据。

代码案例

1. 基本校验示例
package main

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

type User struct {
	Name     string `validate:"required,min=3,max=20"` // 必填,长度3-20
	Email    string `validate:"required,email"`        // 必填,邮箱格式
	Age      int    `validate:"gte=18,lte=120"`        // 年龄范围18-120
	Password string `validate:"required,min=8"`         // 必填,最小长度8
}

func main() {
	validate := validator.New()
	user := User{
		Name:     "Al",       // 长度不足
		Email:    "invalid",  // 无效邮箱
		Age:      15,         // 年龄不足
		Password: "123",      // 长度不足
	}

	err := validate.Struct(user)
	if err != nil {
		for _, err := range err.(validator.ValidationErrors) {
			fmt.Printf("Field: %s, Error: %s\n", err.Field(), err.Tag())
		}
		return
	}
	fmt.Println("Validation passed!")
}

输出

Field: Name, Error: min
Field: Email, Error: email
Field: Age, Error: gte
Field: Password, Error: min

2. 嵌套结构体校验
type Address struct {
	City    string `validate:"required"`
	ZipCode string `validate:"required,len=6"` // 邮编长度为6
}

type UserWithAddress struct {
	Name    string  `validate:"required"`
	Address Address `validate:"required"` // 嵌套结构体必填
}

func main() {
	validate := validator.New()
	user := UserWithAddress{
		Name: "Alice",
		Address: Address{
			City:    "New York",
			ZipCode: "123", // 长度不足
		},
	}

	err := validate.Struct(user)
	if err != nil {
		for _, err := range err.(validator.ValidationErrors) {
			fmt.Printf("Field: %s, Error: %s\n", err.Field(), err.Tag())
		}
	}
}

输出

Field: Address.ZipCode, Error: len

3. 自定义校验规则
func validatePasswordComplexity(fl validator.FieldLevel) bool {
	password := fl.Field().String()
	hasUpper := false
	hasLower := false
	hasDigit := false

	for _, char := range password {
		switch {
		case unicode.IsUpper(char):
			hasUpper = true
		case unicode.IsLower(char):
			hasLower = true
		case unicode.IsDigit(char):
			hasDigit = true
		}
	}

	return hasUpper && hasLower && hasDigit // 必须包含大小写字母和数字
}

func main() {
	validate := validator.New()
	validate.RegisterValidation("password_complexity", validatePasswordComplexity)

	type User struct {
		Password string `validate:"required,password_complexity"`
	}

	user := User{Password: "abc123"} // 缺少大写字母
	err := validate.Struct(user)
	if err != nil {
		for _, err := range err.(validator.ValidationErrors) {
			fmt.Printf("Field: %s, Error: %s\n", err.Field(), err.Tag())
		}
	}
}

输出

Field: Password, Error: password_complexity

4. 结合 Gin 框架使用
package main

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

type LoginRequest struct {
	Username string `json:"username" binding:"required,min=3"`
	Password string `json:"password" binding:"required,min=8"`
}

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

	r.POST("/login", func(c *gin.Context) {
		var req LoginRequest
		if err := c.ShouldBindJSON(&req); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		c.JSON(http.StatusOK, gin.H{"message": "Login successful"})
	})

	r.Run(":8080")
}

测试请求

POST /login
{
  "username": "al",  // 长度不足
  "password": "123"   // 长度不足
}

响应

{
  "error": "Key: 'LoginRequest.Username' Error:Field validation for 'Username' failed on the 'min' tag\nKey: 'LoginRequest.Password' Error:Field validation for 'Password' failed on the 'min' tag"
}

总结

  • 作用validator/v10 是一个高效、灵活的数据校验库,适用于各种需要数据校验的场景。
  • 优势:支持复杂校验规则、嵌套结构、自定义校验和多语言错误消息。
  • 典型场景:API 参数校验、配置文件校验、表单提交校验等。

通过合理使用 validator/v10,可以显著提高代码的健壮性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuyunshengsir

微信:lys20191020

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值