validator
是 Go 语言中非常流行的一个字段验证库,支持多种数据类型的验证规则,非常适合用于表单校验、API 输入参数校验等场景。
go get github.com/go-playground/validator/v10
在使用 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" |
使用 boolean
验证一个值是否为布尔类型:
var b bool
err := validate.Var(b, "boolean")
outRs("boolean", &err)
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)
s := "测试"
err := validate.Var(s, "alphaunicode")
outRs("alphaunicode", &err)
s1 := "abc"
s2 := "abc"
err := validate.VarWithValue(s1, s2, "eqfield")
outRs("eqfield", &err)
使用 len
验证切片的长度:
sl := []int{1, 2, 3}
err := validate.Var(sl, "len=3")
outRs("len=3", &err)
类似于切片,可以使用 len
验证 Map 的长度:
mp := map[int]int{1: 1, 2: 2}
err := validate.Var(mp, "len=2")
outRs("len=2", &err)
可以通过 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)
在某些场景中,我们需要验证字符串是否包含特定的特殊字符。可以通过 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
。为了方便查看验证结果,可以定义一个辅助函数:
func outRs(tag string, err *error) {
log.Println("---start " + tag + "---")
log.Println(*err)
log.Println("---end " + tag + "---")
*err = nil // 显式清除错误值
}
https://github.com/0voice