Skip to content

ormissia/go-opv

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Golang object parameter verifier

Go Reference Repository Size Contributor Last Commit License Open Issues Open Pull Requests

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
}

TODO

  • 写example
  • 增加中文长度判断支持
  • 写测试用例
  • 增加map验证器
  • 增加tag标记模式
  • 通过tag生成规则的方式,关注性能
  • 自定义返回错误信息中字段中文名称

灵感来源