Golang 对象参数验证器
引用方式
go get github.com/ormissia/go-opv
import "github.com/ormissia/go-opv"
package main
import (
"log"
go_opv "github.com/ormissia/go-opv"
)
type User struct {
Name string `go-opv:"名字,ge:0,le:20"` // Name >=0 && Name <=20
Age int `go-opv:"ge:0,lt:100"` // Age >= 0 && Age < 100
}
func init() {
// 使用默认配置:struct tag名字为"go-opv",规则与限定值的分隔符为":"
myVerifier = go_opv.NewVerifier()
// 初始化一个验证规则:Age字段大于等于0,小于200
userRequestRules = go_opv.Rules{
"Age": []string{"年龄",myVerifier.Ge("0"), myVerifier.Lt("200")},
}
}
var myVerifier go_opv.Verifier
var userRequestRules go_opv.Rules
func main() {
// ShouldBind(&user) in Gin framework or other generated object
user := User{
Name: "ormissia",
Age: 1900000,
}
// 两种验证方式混合,函数参数中传入自定义规则时候会覆盖struct tag上定义的规则
// 根据自定义规则Age >= 0 && Age < 200,Age的值为190,符合规则,验证通过
if err := myVerifier.Verify(user, userRequestRules); err != nil {
log.Println(err)
} else {
log.Println("pass")
}
// 只用struct的tag验证
// 根据tag上定义的规则Age >= 0 && Age < 100,Age的值为190,不符合规则,验证不通过
if err := myVerifier.Verify(user); err != nil {
log.Println(err)
} else {
log.Println("pass")
}
}
验证结果:
2021/08/09 22:14:43 pass
2021/08/09 22:14:43 Age length or value is illegal: lt:100
//初始化自定义属性的验证器,并将struct tag名字设为"myVerifier",规则与限定值的分隔符设为"#"
customVerifier := go_opv.NewVerifier(go_opv.SetTagPrefix("myVerifier"), go_opv.SetSeparator("#"))
这时候struct
标签应该写成:
type User struct {
Name string `myVerifier:"ge#0,le#20"` //Name >=0 && Name <=20
Age int `myVerifier:"ge#0,lt#100"` //Age >= 0 && Age < 100
}
写example- 增加中文长度判断支持
- 写测试用例
- 增加
map
验证器 增加tag
标记模式- 通过
tag
生成规则的方式,关注性能 自定义返回错误信息中字段中文名称