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

【Validator】字段验证器介绍,及基本使用go案例

Go 语言 Validator 字段验证详解

validator 是 Go 语言中非常流行的一个字段验证库,支持多种数据类型的验证规则,非常适合用于表单校验、API 输入参数校验等场景。

安装 Validator

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

1. 初始化 Validator

在使用 validator 前,需要对验证器进行初始化。

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

var validate *validator.Validate  

func init() {  
    validate = validator.New() // 初始化验证器  
    validate.SetTagName("v")   // 设置标签名为 v  
}

通过 SetTagName 方法,可以自定义验证规则标签的名称,默认为 validate。在这里我们将其设置为 v


Valdator字段对应 https://github.com/go-playground/validator?tab=readme-ov-file

常用验证规则

验证标签说明示例
required必填validate:"required"
email必须是有效的邮箱validate:"email"
gte大于或等于某个值(支持数值/时间)validate:"gte=18"
lte小于或等于某个值(支持数值/时间)validate:"lte=100"
min字符串/切片/数组长度或数值 >= 指定值validate:"min=3"
max字符串/切片/数组长度或数值 <= 指定值validate:"max=10"
len长度必须等于指定值validate:"len=5"
url必须是有效的 URLvalidate:"url"
uuid必须是有效的 UUIDvalidate:"uuid"
alphanum必须是字母或数字validate:"alphanum"
datetime必须符合时间格式validate:"datetime=2006-01-02"

2. 单字段验证

验证数据类型

布尔类型

使用 boolean 验证一个值是否为布尔类型:

var b bool
err := validate.Var(b, "boolean")
outRs("boolean", &err)
数字类型
  • 验证整数是否为数字可以是字符串整形,也可以直接是int:
var i = "100"
err := validate.Var(i, "number")
outRs("number", &err)
  • 验证浮点数可以是字符串浮点数,也可以直接是浮点数:
var f = 100.11
err := validate.Var(f, "numeric")
outRs("numeric", &err)

验证字符串

  • 验证字符串是否为字母:
s := "abc"
err := validate.Var(s, "alpha")
outRs("alpha", &err)
  • 验证字符串是否为 Unicode 字符(包括中文):
s := "测试"
err := validate.Var(s, "alphaunicode")
outRs("alphaunicode", &err)
  • 比较两个字段是否相等:
s1 := "abc"
s2 := "abc"
err := validate.VarWithValue(s1, s2, "eqfield")
outRs("eqfield", &err)

3. 切片与 Map 验证

验证切片长度

使用 len 验证切片的长度:

sl := []int{1, 2, 3}
err := validate.Var(sl, "len=3")
outRs("len=3", &err)

验证 Map 长度

类似于切片,可以使用 len 验证 Map 的长度:

mp := map[int]int{1: 1, 2: 2}
err := validate.Var(mp, "len=2")
outRs("len=2", &err)

4. 时间格式验证

可以通过 datetime 验证字符串是否符合指定的时间格式:

timeStr := time.Now().Format("2006-01-02 15:04:05 -0700 MST")
err := validate.Var(timeStr, "datetime=2006-01-02 15:04:05 -0700 MST")
outRs("datetime", &err)

5. 特殊字符验证

在某些场景中,我们需要验证字符串是否包含特定的特殊字符。可以通过 regex(正则表达式)规则实现:

示例代码

以下代码检查字符串是否包含 !@#$%^&*(),.?":{}|<> 中的任意特殊字符:

specialCharStr := "abc!@#"
err := validate.Var(specialCharStr, "regex=.*[!@#$%^&*(),.?\":{}|<>].*")
outRs("special_char", &err)
  • 正则解释
    • .* 表示任意字符。
    • [!@#$%^&*(),.?\":{}|<>] 匹配特殊字符的集合。
    • .* 确保字符串可以在特殊字符前后包含其他任意字符。

注意事项

  • regex 是一种非常强大的验证方式,但需要开发者对正则表达式的语法有一定的了解。
  • 当字符串验证失败时,可以通过返回的 err 错误对象获取更具体的信息。
  • 如果项目需要支持国际化,可能需要引入 validator 的翻译包,例如:
    • github.com/go-playground/validator/v10/translations/zh
    • github.com/go-playground/validator/v10/universal-translator

6. 输出结果辅助函数

为了方便查看验证结果,可以定义一个辅助函数:

func outRs(tag string, err *error) {
    log.Println("---start " + tag + "---")
    log.Println(*err)
    log.Println("---end " + tag + "---")
    *err = nil // 显式清除错误值
}

https://github.com/0voice


http://www.kler.cn/a/520663.html

相关文章:

  • C++ STL:深入探索常见容器
  • 蓝桥杯模拟算法:蛇形方阵
  • LongLoRA:高效扩展大语言模型上下文长度的微调方法
  • 从ai产品推荐到利用cursor快速掌握一个开源项目再到langchain手搓一个Text2Sql agent
  • 【Python】导入类
  • windows安装ES
  • MongoDB中的横向扩容数据分片
  • STM32完全学习——RT-thread在STM32F407上移植
  • Spring无法解决的循环依赖
  • 通义灵码插件保姆级教学-IDEA(安装及使用)
  • 重构开源LLM分类:从二分到三分的转变
  • 【数据结构】_链表经典算法OJ(力扣版)
  • Mysql主从复制+MHA实验笔记[特殊字符]
  • git的理解与使用
  • HarmonyOS简介:高效开发与测试
  • 三维网格处理开源软件meshlab源码编译
  • 1.23 补题 寒假训练营
  • 图的矩阵表示
  • GEE | Sentinel-2影像监督分类、精度评估并导出
  • XSLT 编辑 XML:深度解析与实际应用
  • React应用深度优化与调试实战指南
  • SQL 约束
  • 【详解】SVM的核心思想和具体概念
  • 【计算机网络】host文件
  • 【2024年华为OD机试】 (A卷,200分)- 最大化控制资源成本(JavaScriptJava PythonC/C++)
  • 正则表达式 - 命名捕获组