一个用于字符串、数字、切片和结构体的校验库和过滤库。基于validator.js。
安装
在终端中输入以下命令:
go get github.com/asaskevich/govalidator
或者你可以get指定版本的包与gopkg.in:
go get gopkg.in/asaskevich/govalidator.v10
开启此功能,默认情况下会校验所有字段
SetFieldsRequiredByDefault
当结构体中的字段不包括valid或未明确标记为忽略(即使用valid:"-"或valid:"email,optional")都会导致校验失败,另外开启此功能的话可以把它放在一个包的 init() 方法或main()方法。
SetNilPtrAllowedByRequired
允许结构体中required标记的字段为nil。默认情况下,为了保持一致性,会禁用此功能。但是一些在nil值和zero value中间状态的值的包是可以使用的。如果禁用的话,nil值和zero值都会校验失败。
import "github.com/asaskevich/govalidator"func init() {govalidator.SetFieldsRequiredByDefault(true)}
下面是一些代码示例:
// 这个使用govalidator.ValidateStruct()会校验失败(参数的值不匹配)type exampleStruct struct {Name string ``Email string `valid:"email"`}// 当email为空或无效地址的话会校验失败type exampleStruct2 struct {Name string `valid:"-"`Email string `valid:"email"`}// email不为空且地址无效会校验失败type exampleStruct2 struct {Name string `valid:"-"`Email string `valid:"email,optional"`}
最近的重大更改(见#123)
自定义validator函数
可以将context上下文作为第二个参数,如果以struct对象传参的话就会被校验-这使得依赖验证成为可能。。
import "github.com/asaskevich/govalidator"// 旧函数签名func(i interface{}) bool// 新函数签名func(i interface{}, o interface{}) bool
添加自定义validator
这是为了防止访问自定义validator时出现数据竞争。
import "github.com/asaskevich/govalidator"// 旧的方法govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool {// ...}// 新的方法govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, o interface{}) bool {// ...})
函数列表
func Abs(value float64) float64func BlackList(str, chars string) stringfunc ByteLength(str string, params ...string) boolfunc CamelCaseToUnderscore(str string) stringfunc Contains(str, substring string) boolfunc Count(array []interface{}, iterator ConditionIterator) intfunc Each(array []interface{}, iterator Iterator)func ErrorByField(e error, field string) stringfunc ErrorsByField(e error) map[string]stringfunc Filter(array []interface{}, iterator ConditionIterator) []interface{}func Find(array []interface{}, iterator ConditionIterator) interface{}func GetLine(s string, index int) (string, error)func GetLines(s string) []stringfunc HasLowerCase(str string) boolfunc HasUpperCase(str string) boolfunc HasWhitespace(str string) boolfunc HasWhitespaceOnly(str string) boolfunc InRange(value interface{}, left interface{}, right interface{}) boolfunc InRangeFloat32(value, left, right float32) boolfunc InRangeFloat64(value, left, right float64) boolfunc InRangeInt(value, left, right interface{}) boolfunc IsASCII(str string) boolfunc IsAlpha(str string) boolfunc IsAlphanumeric(str string) boolfunc IsBase64(str string) boolfunc IsByteLength(str string, min, max int) boolfunc IsCIDR(str string) boolfunc IsCRC32(str string) boolfunc IsCRC32b(str string) boolfunc IsCreditCard(str string) boolfunc IsDNSName(str string) boolfunc IsDataURI(str string) boolfunc IsDialString(str string) boolfunc IsDivisibleBy(str, num string) boolfunc IsEmail(str string) boolfunc IsExistingEmail(email string) boolfunc IsFilePath(str string) (bool, int)func IsFloat(str string) boolfunc IsFullWidth(str string) boolfunc IsHalfWidth(str string) boolfunc IsHash(str string, algorithm string) boolfunc IsHexadecimal(str string) boolfunc IsHexcolor(str string) boolfunc IsHost(str string) boolfunc IsIP(str string) boolfunc IsIPv4(str string) boolfunc IsIPv6(str string) boolfunc IsISBN(str string, version int) boolfunc IsISBN10(str string) boolfunc IsISBN13(str string) boolfunc IsISO3166Alpha2(str string) boolfunc IsISO3166Alpha3(str string) boolfunc IsISO4217(str string) boolfunc IsISO693Alpha2(str string) boolfunc IsISO693Alpha3b(str string) boolfunc IsIn(str string, params ...string) boolfunc IsInRaw(str string, params ...string) boolfunc IsInt(str string) boolfunc IsJSON(str string) boolfunc IsLatitude(str string) boolfunc IsLongitude(str string) boolfunc IsLowerCase(str string) boolfunc IsMAC(str string) boolfunc IsMD4(str string) boolfunc IsMD5(str string) boolfunc IsMagnetURI(str string) boolfunc IsMongoID(str string) boolfunc IsMultibyte(str string) boolfunc IsNatural(value float64) boolfunc IsNegative(value float64) boolfunc IsNonNegative(value float64) boolfunc IsNonPositive(value float64) boolfunc IsNotNull(str string) boolfunc IsNull(str string) boolfunc IsNumeric(str string) boolfunc IsPort(str string) boolfunc IsPositive(value float64) boolfunc IsPrintableASCII(str string) boolfunc IsRFC3339(str string) boolfunc IsRFC3339WithoutZone(str string) boolfunc IsRGBcolor(str string) boolfunc IsRegex(str string) boolfunc IsRequestURI(rawurl string) boolfunc IsRequestURL(rawurl string) boolfunc IsRipeMD128(str string) boolfunc IsRipeMD160(str string) boolfunc IsRsaPub(str string, params ...string) boolfunc IsRsaPublicKey(str string, keylen int) boolfunc IsSHA1(str string) boolfunc IsSHA256(str string) boolfunc IsSHA384(str string) boolfunc IsSHA512(str string) boolfunc IsSSN(str string) boolfunc IsSemver(str string) boolfunc IsTiger128(str string) boolfunc IsTiger160(str string) boolfunc IsTiger192(str string) boolfunc IsTime(str string, format string) boolfunc IsType(v interface{}, params ...string) boolfunc IsURL(str string) boolfunc IsUTFDigit(str string) boolfunc IsUTFLetter(str string) boolfunc IsUTFLetterNumeric(str string) boolfunc IsUTFNumeric(str string) boolfunc IsUUID(str string) boolfunc IsUUIDv3(str string) boolfunc IsUUIDv4(str string) boolfunc IsUUIDv5(str string) boolfunc IsULID(str string) boolfunc IsUnixTime(str string) boolfunc IsUpperCase(str string) boolfunc IsVariableWidth(str string) boolfunc IsWhole(value float64) boolfunc LeftTrim(str, chars string) stringfunc Map(array []interface{}, iterator ResultIterator) []interface{}func Matches(str, pattern string) boolfunc MaxStringLength(str string, params ...string) boolfunc MinStringLength(str string, params ...string) boolfunc NormalizeEmail(str string) (string, error)func PadBoth(str string, padStr string, padLen int) stringfunc PadLeft(str string, padStr string, padLen int) stringfunc PadRight(str string, padStr string, padLen int) stringfunc PrependPathToErrors(err error, path string) errorfunc Range(str string, params ...string) boolfunc RemoveTags(s string) stringfunc ReplacePattern(str, pattern, replace string) stringfunc Reverse(s string) stringfunc RightTrim(str, chars string) stringfunc RuneLength(str string, params ...string) boolfunc SafeFileName(str string) stringfunc SetFieldsRequiredByDefault(value bool)func SetNilPtrAllowedByRequired(value bool)func Sign(value float64) float64func StringLength(str string, params ...string) boolfunc StringMatches(s string, params ...string) boolfunc StripLow(str string, keepNewLines bool) stringfunc ToBoolean(str string) (bool, error)func ToFloat(str string) (float64, error)func ToInt(value interface{}) (res int64, err error)func ToJSON(obj interface{}) (string, error)func ToString(obj interface{}) stringfunc Trim(str, chars string) stringfunc Truncate(str string, length int, ending string) stringfunc TruncatingErrorf(str string, args ...interface{}) errorfunc UnderscoreToCamelCase(s string) stringfunc ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error)func ValidateStruct(s interface{}) (bool, error)func WhiteList(str, chars string) stringtype ConditionIteratortype CustomTypeValidatortype Errorfunc (e Error) Error() stringtype Errorsfunc (es Errors) Error() stringfunc (es Errors) Errors() []errortype ISO3166Entrytype ISO693Entrytype InterfaceParamValidatortype Iteratortype ParamValidatortype ResultIteratortype UnsupportedTypeErrorfunc (e *UnsupportedTypeError) Error() stringtype Validator
例子
判断是否为URL(IsURL)
println(govalidator.IsURL(`http://user@pass:domain.com/path/page`)) // false
判断类型(IsType)
println(govalidator.IsType("Bob", "string")) // trueprintln(govalidator.IsType(1, "int")) // truei := 1println(govalidator.IsType(&i, "*int")) // true
IsType也可以在struct tag 用type使用, 这对map校验很有必要的:
type User struct {Name string `valid:"type(string)"`Age int `valid:"type(int)"`Meta interface{} `valid:"type(string)"`}result, err := govalidator.ValidateStruct(User{"Bob", 20, "meta"})if err != nil {println("error: " + err.Error())}println(result) // true
ToString
type User struct {FirstName stringLastName string}str := govalidator.ToString(User{"John", "Juan"})println(str) // {John Juan}
遍历(Each),Map,过滤,切片计数
遍历迭代array和slice会调用Iterator
data := []interface{}{1, 2, 3}var fn govalidator.Iterator = func(value interface{}, index int) {println(value.(int))}govalidator.Each(data, fn)//1//2//3
data := []interface{}{1, 2, 3, 4, 5}var fn govalidator.ResultIterator = func(value interface{}, index int) interface{} {return value.(int) * 3}_ = govalidator.Map(data, fn) // result = []interface{}{1, 6, 9, 12, 15}
data := []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}var fn govalidator.ConditionIterator = func(value interface{}, index int) bool {return value.(int)%2 == 0}_ = govalidator.Filter(data, fn) // result = []interface{}{2, 4, 6, 8, 10}_ = govalidator.Count(data, fn) // result = 5
校验struct
如果要校验structs,你可以在struct的任何字段中使用valid tag。使用此字段的所有validator在一个tag中均按逗号进行分隔。如果你想跳过校验,请将-放在你的tag中。如果下面列表中没有你需要的validator,你可以按下面例子添加:
govalidator.TagMap["duck"] = govalidator.Validator(func(str string) bool {return str == "duck"})
有关完全自定义validator(基于接口),请参阅下文。
下面是在结构体字段中的可以使用的validator列表(validator - 使用方法):
"email": IsEmail,"url": IsURL,"dialstring": IsDialString,"requrl": IsRequestURL,"requri": IsRequestURI,"alpha": IsAlpha,"utfletter": IsUTFLetter,"alphanum": IsAlphanumeric,"utfletternum": IsUTFLetterNumeric,"numeric": IsNumeric,"utfnumeric": IsUTFNumeric,"utfdigit": IsUTFDigit,"hexadecimal": IsHexadecimal,"hexcolor": IsHexcolor,"rgbcolor": IsRGBcolor,"lowercase": IsLowerCase,"uppercase": IsUpperCase,"int": IsInt,"float": IsFloat,"null": IsNull,"uuid": IsUUID,"uuidv3": IsUUIDv3,"uuidv4": IsUUIDv4,"uuidv5": IsUUIDv5,"creditcard": IsCreditCard,"isbn10": IsISBN10,"isbn13": IsISBN13,"json": IsJSON,"multibyte": IsMultibyte,"ascii": IsASCII,"printableascii": IsPrintableASCII,"fullwidth": IsFullWidth,"halfwidth": IsHalfWidth,"variablewidth": IsVariableWidth,"base64": IsBase64,"datauri": IsDataURI,"ip": IsIP,"port": IsPort,"ipv4": IsIPv4,"ipv6": IsIPv6,"dns": IsDNSName,"host": IsHost,"mac": IsMAC,"latitude": IsLatitude,"longitude": IsLongitude,"ssn": IsSSN,"semver": IsSemver,"rfc3339": IsRFC3339,"rfc3339WithoutZone": IsRFC3339WithoutZone,"ISO3166Alpha2": IsISO3166Alpha2,"ISO3166Alpha3": IsISO3166Alpha3,"ulid": IsULID,
带参数的validator
"range(min|max)": Range,"length(min|max)": ByteLength,"runelength(min|max)": RuneLength,"stringlength(min|max)": StringLength,"matches(pattern)": StringMatches,"in(string1|string2|...|stringN)": IsIn,"rsapub(keylength)" : IsRsaPub,"minstringlength(int): MinStringLength,"maxstringlength(int): MaxStringLength,
带任何类型参数的validator
"type(type)": IsType,
下面是使用的小例子:
type Post struct {Title string `valid:"alphanum,required"`Message string `valid:"duck,ascii"`Message2 string `valid:"animal(dog)"`AuthorIP string `valid:"ipv4"`Date string `valid:"-"`}post := &Post{Title: "My Example Post",Message: "duck",Message2: "dog",AuthorIP: "123.234.54.3",}// 可以添加自己想要检验的tagsgovalidator.TagMap["duck"] = govalidator.Validator(func(str string) bool {return str == "duck"})// 可以添加自己想要检验的参数tagsgovalidator.ParamTagMap["animal"] = govalidator.ParamValidator(func(str string, params ...string) bool {species := params[0]return str == species})govalidator.ParamTagRegexMap["animal"] = regexp.MustCompile("^animal\\((\\w+)\\)$")result, err := govalidator.ValidateStruct(post)if err != nil {println("error: " + err.Error())}println(result)
校验Map
如果你想要校验Map,可以用需要校验的Map和包含在ValidateStruct使用的相同Tag的校验Map,并且两个Map必须是map[string]interface{}的类型
下面是使用的小例子:
var mapTemplate = map[string]interface{}{"name":"required,alpha","family":"required,alpha","email":"required,email","cell-phone":"numeric","address":map[string]interface{}{"line1":"required,alphanum","line2":"alphanum","postal-code":"numeric",},}var inputMap = map[string]interface{}{"name":"Bob","family":"Smith","email":"foo@bar.baz","address":map[string]interface{}{"line1":"","line2":"","postal-code":"",},}result, err := govalidator.ValidateMap(inputMap, mapTemplate)if err != nil {println("error: " + err.Error())}println(result)
白名单
// 从一个string中移除a-z之外的所有字符println(govalidator.WhiteList("a3a43a5a4a3a2a23a4a5a4a3a4", "a-z") == "aaaaaaaaaaaa")
自定义校验函数
允许使用你自定义特定域的validators - 例子如下:
import "github.com/asaskevich/govalidator"type CustomByteArray [6]byte // 支持自定义类型并可以进行校验type StructWithCustomByteArray struct {ID CustomByteArray `valid:"customByteArrayValidator,customMinLengthValidator"` // 多个自定义validator也是可以的,并将按顺序进行处理Email string `valid:"email"`CustomMinLength int `valid:"-"`}govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, context interface{}) bool {switch v := context.(type) {case StructWithCustomByteArray:case SomeOtherType:// ...default://}switch v := i.(type) {case CustomByteArray:for _, e := range v {if e != 0 {return true}}}return false})govalidator.CustomTypeTagMap.Set("customMinLengthValidator", func(i interface{}, context interface{}) bool {switch v := context.(type) { // 会根据另一个字段中的值校验一个字段,即依赖的校验case StructWithCustomByteArray:return len(v.ID) >= v.CustomMinLength}return false})
遍历Error
默认情况下,Error()在单个字符串中返回所有错误。要获取每个error,可以这样做:
if err != nil {errs := err.(govalidator.Errors).Errors()for _, e := range errs {fmt.Println(e.Error())}}
自定义error消息
通过添加~分隔号可以自定义错误消息-例子如下
type Ticket struct {Id int64 `json:"id"`FirstName string `json:"firstname" valid:"required~First name is blank"`}
相关库比较
| 库名 | 介绍 | star数 |
|---|---|---|
| https://github.com/gookit/validate | Go通用的数据验证与过滤库,使用简单,内置大部分常用验证、过滤器,支持自定义验证器、自定义消息、字段翻译。咱国人开发的。文档可参考 https://github.com/gookit/validate/blob/master/README.zh-CN.md | 500 |
| https://github.com/go-ozzo/ozzo-validation | 一个常用的Go验证包。支持使用普通语言构造而不是容易出错的struct标记的可配置和可扩展的验证规则的校验库。 | 2.1k |
| https://github.com/go-playground/validator | Go 结构体和字段校验库, 包括跨字段, 跨Struct, Map, Slice和Array。另外gin也默认支持。可参考大俊大佬Go 每日一库之 validator | 7.8k |
| https://github.com/asaskevich/govalidator | 一个用于字符串、数字、切片和结构体的校验库和过滤库。基于validator.js 。 |
4.7k |
