Golang Validator
1. 简介
validator
是 Go 语言中一个强大的数据验证库,它提供结构体字段标签验证功能,并支持自定义验证规则。
2. 安装
go get github.com/go-playground/validator/v10
3. 基本使用
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type User struct {
Name string `validate:"required"`
Age int `validate:"gte=18,lte=65"`
Email string `validate:"required,email"`
}
func main() {
validate := validator.New()
user := User{
Name: "",
Age: 17,
Email: "invalid-email",
}
err := validate.Struct(user)
if err != nil {
for _, err := range err.(validator.ValidationErrors) {
fmt.Println("Validation error:", err)
}
} else {
fmt.Println("Validation passed")
}
}
4. 常见的内置验证标签
标签 | 描述 |
---|---|
required | 必填字段 |
必须是合法的邮箱格式 | |
gte=X | 大于等于 X |
lte=X | 小于等于 X |
min=X | 字符串、切片、映射的最小长度 |
max=X | 字符串、切片、映射的最大长度 |
len=X | 长度必须等于 X |
url | 必须是合法的 URL |
numeric | 必须是数字 |
alphanum | 仅允许字母和数字 |
alpha | 仅允许字母 |
contains=X | 必须包含 X 子串 |
startswith=X | 必须以 X 开头 |
endswith=X | 必须以 X 结尾 |
lowercase | 必须为小写 |
uppercase | 必须为大写 |
ipv4 | 必须是合法的 IPv4 地址 |
ipv6 | 必须是合法的 IPv6 地址 |
boolean | 必须是布尔值 |
datetime=layout | 必须是指定格式的日期时间 |
base64 | 必须是 Base64 编码格式 |
hexcolor | 必须是十六进制颜色代码 |
uuid | 必须是合法的 UUID |
json | 必须是合法的 JSON 字符串 |
ascii | 仅允许 ASCII 字符 |
printascii | 仅允许可打印 ASCII 字符 |
multibyte | 允许多字节字符 |
containsany=chars | 必须包含 chars 中的至少一个字符 |
excludesall=chars | 不能包含 chars 中的任何字符 |
excludes=X | 不能包含 X 子串 |
isdefault | 必须是字段类型的默认值 |
dive | 用于切片或者map的验证 |
5. 自定义验证
可以自定义验证规则,例如验证字符串是否为 "hello":
func helloValidator(fl validator.FieldLevel) bool {
return fl.Field().String() == "hello"
}
func main() {
validate := validator.New()
validate.RegisterValidation("hello", helloValidator)
type Test struct {
Msg string `validate:"hello"`
}
t := Test{Msg: "world"}
err := validate.Struct(t)
if err != nil {
fmt.Println("Validation failed:", err)
} else {
fmt.Println("Validation passed")
}
}
6. 结构体嵌套验证
type Address struct {
City string `validate:"required"`
ZipCode string `validate:"numeric"`
}
type Person struct {
Name string `validate:"required"`
Age int `validate:"gte=18"`
Address Address `validate:"required"`
}
required
关键字表示深入到嵌套结构体中进行验证。
7. 处理错误信息
if err != nil {
for _, e := range err.(validator.ValidationErrors) {
fmt.Printf("Field %s failed on '%s' tag\n", e.Field(), e.Tag())
}
}
8. 结论
validator
提供了丰富的验证功能,适用于 Go 项目中的输入校验场景,可以结合 gin
或其他 Web 框架进行 API 参数验证,提高数据的可靠性。