Skip to main content

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必填字段
email必须是合法的邮箱格式
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 参数验证,提高数据的可靠性。