golang基于标签快速验证结构体的插件库govalid的使用
Golang基于标签快速验证结构体的插件库govalid的使用
基本示例
Govalid是一个用于验证结构体的Golang库,它通过结构体标签来定义验证规则。下面是一个基本使用示例:
package main
import (
"errors"
"fmt"
"log"
"strings"
"unicode/utf8"
"github.com/twharmon/govalid"
)
type Post struct {
// ID没有约束
ID int
// Title是必填字段,至少3个字符,最多20个字符
Title string `valid:"req|min:3|max:20"`
// Body不是必填字段,最多10000个字符,且必须满足"fun"规则(下面定义的自定义规则)
Body string `valid:"max:10000|fun"`
}
func main() {
// 添加自定义字符串规则"fun",可以用于任何结构体中的字符串字段
govalid.Rule("fun", func(v any) error {
switch tv := v.(type) {
case string:
if float64(strings.Count(tv, "!"))/float64(utf8.RuneCountInString(tv)) > 0.001 {
return nil
}
// 使用govalid.NewValidationError返回验证错误
return govalid.NewValidationError("必须包含更多感叹号")
default:
// 返回非验证(内部)错误
return errors.New("fun约束只能应用于字符串")
}
})
fmt.Println(govalid.Validate(&Post{
ID: 5,
Title: "Hi",
Body: "Hello world!",
}))
}
错误处理
当调用govalid.Validate
验证结构体时,如果验证规则不满足会返回错误。这个错误可能是验证特定的错误(实现了govalid.ValidationError
接口),也可能是处理验证时出现的其他错误。
if err := govalid.Validate(value); err != nil {
verr, ok := err.(govalid.ValidationError)
if ok {
fmt.Println("验证错误", err)
} else {
fmt.Println("其他错误", err)
}
}
Dive规则用法
dive
规则用于对指针、切片、数组和结构体中的元素应用验证规则。当遇到dive
规则时,它会"深入"到集合的元素或指针指向的值,并对每个元素或解引用后的值应用剩余的规则。
注意事项
- 指针:
dive
规则会解引用指针并对指向的值应用剩余规则 - 切片/数组:
dive
规则会遍历切片或数组中的每个元素并应用剩余规则 - 结构体:
dive
规则会根据结构体自身的字段标签验证结构体
示例
指针
type Example struct {
Field *string `valid:"req|dive|min:3"`
}
在这个例子中,Field必须是一个非nil的字符串指针,并且字符串长度至少为3个字符。
切片/数组
type Example struct {
Field []string `valid:"req|dive|min:3"`
}
在这个例子中,Field必须是一个非nil的字符串切片,并且切片中的每个字符串长度至少为3个字符。
结构体
type Inner struct {
Name string `valid:"req"`
}
type Outer struct {
InnerStruct Inner `valid:"dive"`
}
在这个例子中,InnerStruct字段将根据Inner结构体中定义的验证标签进行验证。
更多关于golang基于标签快速验证结构体的插件库govalid的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复