validator, 包验证器实现结构域验证

分享于 

7分钟阅读

GitHub

  繁體 雙語
Package validator implements struct field validations
  • 源代码名称:validator
  • 源代码网址:http://www.github.com/go-validator/validator
  • validator源代码文档
  • validator源代码下载
  • Git URL:
    git://www.github.com/go-validator/validator.git
    Git Clone代码到本地:
    git clone http://www.github.com/go-validator/validator
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/go-validator/validator
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    封装验证程序

    包验证器实现变量验证

    安装

    去拿吧。

    
    go get gopkg.in/validator.v2
    
    
    
    

    然后把这个包导入你自己的代码中。

    
    import (
    
    
    "gopkg.in/validator.v2"
    
    
    )
    
    
    
    
    用法

    请参阅 http://godoc.org/gopkg.in/validator.v2 以获得详细的。 一个简单的例子就是。

    
    type NewUserRequest struct {
    
    
     Username string `validate:"min=3,max=40,regexp=^[a-zA-Z]*$"`
    
    
     Name string `validate:"nonzero"`
    
    
     Age int `validate:"min=21"`
    
    
     Password string `validate:"min=8"`
    
    
    }
    
    
    
    nur := NewUserRequest{Username:"something", Age: 20}
    
    
    if errs := validator.Validate(nur); errs!= nil {
    
    
    //values not valid, deal with errors here
    
    
    }
    
    
    
    

    内置确认器

    下面是在包中构建的确认器列表。

    
    len
    
    
     For numeric numbers, max will simply make sure that the
    
    
     value is equal to the parameter given. For strings, it
    
    
     checks that the string length is exactly that number of
    
    
     characters. For slices, arrays, and maps, validates the
    
    
     number of items. (Usage: len=10)
    
    
    
    max
    
    
     For numeric numbers, max will simply make sure that the
    
    
     value is lesser or equal to the parameter given. For strings,
    
    
     it checks that the string length is at most that number of
    
    
     characters. For slices, arrays, and maps, validates the
    
    
     number of items. (Usage: max=10)
    
    
    
    min
    
    
     For numeric numbers, min will simply make sure that the value
    
    
     is greater or equal to the parameter given. For strings, it
    
    
     checks that the string length is at least that number of
    
    
     characters. For slices, arrays, and maps, validates the
    
    
     number of items. (Usage: min=10)
    
    
    
    nonzero
    
    
     This validates that the value is not zero. The appropriate
    
    
     zero value is given by the Go spec (e.g. for int it's 0, for
    
    
     string it's"", for pointers is nil, etc.) For structs, it
    
    
     will not check to see if the struct itself has all zero
    
    
     values, instead use a pointer or put nonzero on the struct's
    
    
     keys that you care about. (Usage: nonzero)
    
    
    
    regexp
    
    
     Only valid for string types, it will validator that the
    
    
     value matches the regular expression provided as parameter.
    
    
     (Usage: regexp=^a.*b$)
    
    
    
    

    自定义验证程序

    可以使用SetValidationFunc定义自定义确认器。 首先,需要创建验证函数。

    
    //Very simple validator
    
    
    func notZZ(v interface{}, param string) error {
    
    
     st := reflect.ValueOf(v)
    
    
     if st.Kind()!= reflect.String {
    
    
     return errors.New("notZZ only validates strings")
    
    
     }
    
    
     if st.String() =="ZZ" {
    
    
     return errors.New("value cannot be ZZ")
    
    
     }
    
    
     return nil
    
    
    }
    
    
    
    

    然后需要将它添加到验证器列表中,并给它一个"标签"名称。

    
    validator.SetValidationFunc("notzz", notZZ)
    
    
    
    

    那么就可以使用notzz验证标签。 这将打印"一个错误: 值不能为 ZZ"

    
    type T struct {
    
    
     A string `validate:"nonzero,notzz"`
    
    
    }
    
    
    t := T{"ZZ"}
    
    
    if errs := validator.Validate(t); errs!= nil {
    
    
     fmt.Printf("Field A error: %sn", errs["A"][0])
    
    
    }
    
    
    
    

    你还可以有多个验证器规则和 SetTag()。

    
    type T struct {
    
    
     A int `foo:"nonzero" bar:"min=10"`
    
    
    }
    
    
    t := T{5}
    
    
    SetTag("foo")
    
    
    validator.Validate(t)//valid as it's nonzero
    
    
    SetTag("bar")
    
    
    validator.Validate(t)//invalid as it's less than 10
    
    
    
    

    SetTag可能更好地用于多个验证器。

    
    fooValidator := validator.NewValidator()
    
    
    fooValidator.SetTag("foo")
    
    
    barValidator := validator.NewValidator()
    
    
    barValidator.SetTag("bar")
    
    
    fooValidator.Validate(t)
    
    
    barValidator.Validate(t)
    
    
    
    

    这将保留验证程序的默认标记。 同样,请参考godocs以获得更多的示例和不同的用法。

    请求策略

    Contributions博士欢迎。

    存储库按版本分支组织。 将请求请求拉到中断API兼容性的v2 分支将不会被接受。 可以在主服务器中中断 API,而不是在分支目录中。

    对于验证函数,首选项是保持主代码简单,并将大多数新函数添加到验证器贡献库存储库。

    https://github.com/go-validator/validator-contrib

    为了改进和修改内置验证功能,请确保行为不会破坏分支中已有的功能。 如果你看到内置的功能会显著改变,请对 master 发送一个请求请求。 我们可以讨论是否应该将更改合并到版本分支中。

    许可证

    版权所有 2014 Roberto Teixeira robteix@robteix.com

    在Apache许可以证下许可以证版本 2.0 ("许可以证") ;你可以能不使用这里文件,除了符合许可以证。 你可以获得许可证的副本在*

    http://www.apache.org/licenses/LICENSE-2.0

    在规定的法律或者书面许可下,在许可条款下分发的软件在不保证任何种类的担保或者条件的前提下分发,或者明示或者隐含。 查看许可协议下特定语言的许可权限和限制的许可证。


    IMP  str  PAC  PACK  Struct  字段