当前位置: 首页 > news >正文

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 mainimport ("fmt""github.com/go-playground/validator/v10"
)type User struct {Name     string `validate:"required,min=3,max=20"` // 必填,长度3-20Email    string `validate:"required,email"`        // 必填,邮箱格式Age      int    `validate:"gte=18,lte=120"`        // 年龄范围18-120Password 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 := falsehasLower := falsehasDigit := falsefor _, char := range password {switch {case unicode.IsUpper(char):hasUpper = truecase unicode.IsLower(char):hasLower = truecase 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 mainimport ("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 LoginRequestif 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,可以显著提高代码的健壮性和可维护性。

相关文章:

  • Js扩展DOM、BOM、AJAX、事件、定时器
  • 系统架构设计师:设计模式概述
  • 为 Unity 项目添加自定义 USB HID 设备支持 (适用于 PC 和 Android/VR)-任何手柄、无人机手柄、摇杆、方向盘
  • 补题( Convolution, 二维卷积求输出矩阵元素和最大值)
  • 华为云Astro大屏连接器创建操作实例:抽取物联网iotda影子设备数据的连接器创建
  • 【中间件】bthread_基础_TaskControl
  • Kotlin革新数据分析
  • linux 使用nginx部署next.js项目,并使用pm2守护进程
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(六)
  • 快速上手非关系型数据库-MongoDB
  • 使用Node编写轻量级后端快速入门
  • UDP数据包和TCP数据包的区别;网络编程套接字;不同协议的回显服务器
  • WPF采集欧姆龙PLC、基恩士PLC、西门子PLC、汇川PLC、台达PLC数据
  • WPF实现数据库操作与日志记录
  • 2025年- H17-Lc125-73.矩阵置零(矩阵)---java版
  • MySQL 查找指定表名的表的主键
  • Kubernetes(k8s)的API Server 组件原理与结合生产实战教程
  • 【LeetCode Hot100】回溯篇
  • Flowable7.x学习笔记(十六)分页查询我的待办
  • Ethan独立开发产品日报 | 2025-04-30
  • 比黄油年糕热量还高,这个火爆全网的甜品劝你慎吃
  • 俄伏尔加格勒机场正式更名为斯大林格勒机场
  • 张炜琳已任三明市委常委、宣传部部长
  • 国泰海通合并后首份业绩报告出炉:一季度净利润增逾391%
  • 从腰缠万贯到债台高筑、官司缠身:尼泊尔保皇新星即将陨落?
  • 第五届全国医院人文管理路演在昆山举办:患者体验才是温度计