golang轻量级数据模型验证插件库Validator的使用
Golang轻量级数据模型验证插件库Validator的使用
Validator是一个用Go编写的轻量级模型验证器。
特性
- 支持多语言
快速开始
package main
import (
"fmt"
v "github.com/go-the-way/validator"
)
func main() {
// 创建一个结构体并添加验证标签
result := v.New(&struct {
int `validate:"min(10,fail)"` // 验证int值是否>=10,不通过时返回"fail"消息
}{}).Validate()
// 输出验证结果
fmt.Println(result.Passed) // 打印验证是否通过
fmt.Println(result.Messages()) // 打印验证消息
}
自定义验证实现
package main
import (
"fmt"
v "github.com/go-the-way/validator"
"reflect"
)
func main() {
// 注册自定义验证器
v.Custom("mycustom", func(value reflect.Value) (bool, string) {
return false, "mycustom validation."
})
// 使用自定义验证器
vv := v.New(&struct {
Name string `validate:"custom(mycustom)"` // 使用自定义验证器
}{}).Validate()
// 输出验证结果
fmt.Println(vv.Passed) // 打印验证是否通过
fmt.Println(vv.Messages()) // 打印验证消息
}
支持的验证器
名称 | 支持类型 | 示例 | 描述 |
---|---|---|---|
Min | ([])(*)uint{8,64} , ([])(*)int{8,64} , ([])(*)float{32,64} |
validate:“min(N,invalid)” | 每个值必须 >= N |
Max | ([])(*)uint{8,64} , ([])(*)int{8,64} , ([])(*)float{32,64} |
validate:“max(N,invalid)” | 每个值必须 <= N |
Length | (*)string , (*)Array[(*)string] , (*)Slice[(*)string] |
validate:“length(N,invalid)” | 字符串长度或每个字符串元素的长度必须 == N |
ArrLength | (*)Array[(*)Any] , (*)Slice[(*)Any] |
validate:“arr_length(N,invalid)” | 数组或切片的长度必须 == N |
MinLength | (*)string , (*)Array[(*)string] , (*)Slice[(*)string] |
validate:“minlength(N,invalid)” | 字符串长度或每个字符串元素的长度必须 >= N |
ArrMinLength | (*)Array[(*)Any] , (*)Slice[(*)Any] |
validate:“arr_minlength(N,invalid)” | 数组或切片的长度必须 >= N |
MaxLength | (*)string , (*)Array[(*)string] , (*)Slice[(*)string] |
validate:“maxlength(N,invalid)” | 字符串长度或每个字符串元素的长度必须 <= N |
ArrMaxLength | (*)Array[(*)Any] , (*)Slice[(*)Any] |
validate:“arr_maxlength(N,invalid)” | 数组或切片的长度必须 <= N |
Enum | ([])(*)uint{8,64} , ([])(*)int{8,64} , ([])(*)float{32,64} , ([])(*)string |
validate:“enum(O,invalid)” | 每个值必须是O中的一个 |
Regex | ([])(*)string |
validate:“regex(RE,invalid)” | 每个值必须匹配RE正则表达式 |
Valid | *struct{} |
validate:“valid(T,invalid)” | 值必须不为nil |
Custom | any |
validate:“custom(CUSTOM)” | 自定义验证 |
更多关于golang轻量级数据模型验证插件库Validator的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang轻量级数据模型验证插件库Validator的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang轻量级数据模型验证插件库Validator的使用
Validator是Go语言中一个非常流行的轻量级数据验证库,它提供了简单而强大的方式来验证各种数据结构。下面我将详细介绍它的使用方法。
安装Validator
首先需要安装validator库:
go get github.com/go-playground/validator/v10
基本使用
1. 简单验证
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type User struct {
Name string `validate:"required,min=3,max=20"`
Email string `validate:"required,email"`
Age int `validate:"gte=18,lte=60"`
Password string `validate:"required,min=8"`
}
func main() {
validate := validator.New()
user := User{
Name: "John",
Email: "john@example.com",
Age: 25,
Password: "secret123",
}
err := validate.Struct(user)
if err != nil {
fmt.Println("Validation errors:", err)
} else {
fmt.Println("Validation passed!")
}
}
2. 常用验证标签
Validator提供了丰富的验证标签:
required
- 字段必须设置min
/max
- 最小/最大值(数字)或长度(字符串)len
- 固定长度eq
/ne
- 等于/不等于gt
/gte
/lt
/lte
- 大于/大于等于/小于/小于等于email
- 必须是有效的电子邮件地址url
- 必须是有效的URLalpha
- 只能包含字母alphanum
- 只能包含字母和数字numeric
- 必须是有效的数字hexadecimal
- 必须是有效的十六进制uuid
- 必须是有效的UUID
高级用法
1. 自定义验证函数
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
var validate *validator.Validate
func init() {
validate = validator.New()
_ = validate.RegisterValidation("coolusername", validateCoolUsername)
}
func validateCoolUsername(fl validator.FieldLevel) bool {
username := fl.Field().String()
return len(username) > 5 && username[0] == 'x'
}
type User struct {
Username string `validate:"required,coolusername"`
}
func main() {
user := User{Username: "xander"}
err := validate.Struct(user)
if err != nil {
fmt.Println("Validation error:", err)
} else {
fmt.Println("Validation passed!")
}
}
2. 嵌套结构体验证
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type Address struct {
Street string `validate:"required"`
City string `validate:"required"`
Zip string `validate:"required,numeric,len=5"`
}
type User struct {
Name string `validate:"required"`
Age int `validate:"gte=18"`
Address Address `validate:"required"`
}
func main() {
validate := validator.New()
user := User{
Name: "Alice",
Age: 20,
Address: Address{
Street: "123 Main St",
City: "New York",
Zip: "10001",
},
}
err := validate.Struct(user)
if err != nil {
fmt.Println("Validation errors:", err)
} else {
fmt.Println("Validation passed!")
}
}
3. 错误处理
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type User struct {
Name string `validate:"required"`
Email string `validate:"required,email"`
Age int `validate:"gte=18"`
}
func main() {
validate := validator.New()
user := User{
Name: "",
Email: "invalid-email",
Age: 16,
}
err := validate.Struct(user)
if err != nil {
if _, ok := err.(*validator.InvalidValidationError); ok {
fmt.Println("Invalid validation error:", err)
return
}
for _, err := range err.(validator.ValidationErrors) {
fmt.Printf("Field: %s, Error: %s, Value: %v\n",
err.Field(),
err.Tag(),
err.Value())
}
}
}
4. 跨字段验证
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type Registration struct {
Email string `validate:"required,email"`
Password string `validate:"required,min=8"`
PasswordConfirm string `validate:"required,eqfield=Password"`
}
func main() {
validate := validator.New()
reg := Registration{
Email: "test@example.com",
Password: "password123",
PasswordConfirm: "password123",
}
err := validate.Struct(reg)
if err != nil {
fmt.Println("Validation errors:", err)
} else {
fmt.Println("Validation passed!")
}
}
性能优化
Validator默认会缓存结构体的验证信息,因此重复验证相同结构体时性能很好。对于高性能场景,可以预先解析验证规则:
type User struct {
Name string `validate:"required"`
Age int `validate:"gte=18"`
}
func main() {
validate := validator.New()
userType := reflect.TypeOf(User{})
// 预先解析验证规则
if _, err := validate.GetStructValidationRules(userType); err != nil {
panic(err)
}
// 后续验证会更快
user := User{Name: "John", Age: 20}
_ = validate.Struct(user)
}
总结
Validator是一个功能强大且灵活的Go语言验证库,具有以下特点:
- 轻量级且高性能
- 丰富的内置验证规则
- 支持自定义验证函数
- 良好的错误处理机制
- 支持嵌套结构体验证
- 支持跨字段验证
通过合理使用Validator,可以大大简化Go应用程序中的数据验证工作,同时保持代码的整洁和可维护性。