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

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,可以显著提高代码的健壮性和可维护性。

http://www.xdnf.cn/news/3320.html

相关文章:

  • 2025五一杯数学建模A题:支路车流量推测问题,思路分析+模型代码
  • 拉宾公钥密码算法实现
  • 面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解
  • IDEA在项目中添加模块出现Error adding module to project: null(向项目添加模块时出错: null)的解决方法
  • 位运算切换大小写
  • 数字智慧方案6158丨智慧医疗解决方案精华版(58页PPT)(文末有下载方式)
  • Spark,集群搭建之Yarn模式
  • go实现双向链表
  • Unity SpriteRenderer(精灵渲染器)
  • Linux常用命令27——userdel删除用户
  • 如何阅读GitHub上的深度学习项目
  • 论文报错3
  • js文件加密。安装 Terser
  • C++负载均衡远程调用学习之TCP连接封装与TCPCLIENT封装
  • 审计专员简历模板
  • 【Hot 100】23. 合并 K 个升序链表
  • 【深度学习新浪潮】小米MiMo-7B报告内容浅析
  • MATLAB中removedelay函数用法
  • 区间贪心 (区间端点处理)
  • llamafactory-cli webui启动报错TypeError: argument of type ‘bool‘ is not iterable
  • 《AI大模型应知应会100篇》第41篇:多轮对话设计:构建高效的交互式应用
  • CentOS 7 下安装 supervisor-3.4.0-1.el7.noarch.rpm 详细步骤
  • QMK固件开发指南:构建您的第一个固件
  • 22.2Linux的I2C驱动实验(编程)_csdn
  • 2024年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Qt指南针
  • 9. 深入Spring AI:刨析 ChatMemory
  • 从MCP基础到FastMCP实战应用
  • 攻防世界 - Web - Level 4 | Confusion1
  • qemu学习笔记:QOM