【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 | 必须是有效的 URL | validate:"url" |
uuid | 必须是有效的 UUID | validate:"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