本文小编为大家详细介绍“Golang验证器之validator怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang验证器之validator怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
Validator
是一个 Golang 的第三方库,用于对数据进行校验,常用于 API 的开发中,对客户端发出的请求数据进行严格校验,防止恶意请求。
validator包安装:
go get -u github.com/go-playground/validator/v10
导入validator:
import "github.com/go-playground/validator/v10"
validator 应用了 Golang
的 Struct Tag
和 Reflect
机制,基本思想是:在 Struct Tag
中为不同的字段定义各自类型的约束,然后通过 Reflect
获取这些约束的类型信息并在校验器中进行数据校验。
示例:
package main import ( "fmt" "github.com/go-playground/validator/v10" ) type User struct { UserName string `json:"user_name" validate:"required"` Password string `json:"password" validate:"required,min=6,max=20"` } func main() { example := User{ Password: "123", } //实例化验证器 validate := validator.New() errs := validate.Struct(example) if errs != nil { for _, err := range errs.(validator.ValidationErrors) { fmt.Println(err) } } }
validator包的验证提示默认是英文的,输出如下:
这样看可能不太清楚,如果需要翻译成中文则还需安装验证提示翻译包:
go get -u github.com/go-playground/locales go get -u github.com/go-playground/universal-translator
修改后如下:
package main import ( "fmt" "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zh_translations "github.com/go-playground/validator/v10/translations/zh" ) type User struct { UserName string `json:"user_name" validate:"required"` Password string `json:"password" validate:"required,min=6,max=20"` } func main() { example := User{ Password: "123", } // 中文翻译器 uni := ut.New(zh.New()) trans, _ := uni.GetTranslator("zh") //实例化验证器 validate := validator.New() // 注册翻译器到校验器 err := zh_translations.RegisterDefaultTranslations(validate, trans) if err!=nil { fmt.Println(err) return } errs := validate.Struct(example) if errs != nil { for _, err := range errs.(validator.ValidationErrors) { fmt.Println(err.Translate(trans)) } } }
执行输出:
下面列举一部分我们开发中经常用到的验证规则
Tag | 说明 | 示例 |
---|---|---|
required | 必填 | Field或Struct validate:"required" |
omitempty | 空时忽略 | Field或Struct validate:"omitempty" |
len | 长度 | Field validate:"len=0" |
eq | 等于 | Field validate:"eq=0" |
gt | 大于 | Field validate:"gt=0" |
gte | 大于等于 | Field validate:"gte=0" |
lt | 小于 | Field validate:"lt=0" |
lte | 小于等于 | Field validate:"lte=0" |
min | 最小值 | Field validate:"min=1" |
max | 最大值 | Field validate:"max=2" |
required_with | 其他字段其中一个不为空且当前字段不为空 | Field validate:"required_with=Field1 Field2" |
required_without | 其他字段其中一个为空且当前字段不为空 | Field `validate:“required_without=Field1 Field2” |
lowercase | 符串值是否只包含小写字符 | Field validate:"lowercase" |
uppercase | 符串值是否只包含大写字符 | Field validate:"uppercase" |
字符串值包含一个有效的电子邮件 | Field validate:"email" | |
json | 字符串值是否为有效的JSON | Field validate:"json" |
url | 符串值是否包含有效的url | Field validate:"url" |
uri | 符串值是否包含有效的 uri | Field validate:"uri" |
contains | 字符串值包含子字符串值 | Field validate:"contains=@" |
excludes | 字符串值不包含子字符串值 | 字符串值不包含子字符串值 Field validate:"excludes=@" |
ip | 字符串值是否包含有效的 IP 地址 | Field validate:"ip" |
datetime | 字符串值是否包含有效的日期 | Field validate:"datetime" |
startswith | 字符串以提供的字符串值开始 | Field validate:"startswith=abc" |
endswith | 字符串以提供的字符串值结束 | Field validate:"endswith=abc" |
validator 允许定义跨字段验证,即:验证某个字段与其他字段之间的关系。这种验证实际上分为两种:
一种是参数字段就是同一个结构体中的平级字段。
另一种是参数字段为结构中其他字段的字段。
验证语法很简单,如果是验证同一个结构中的字段,则在基础的 Tags 后面添加一个 field 后缀,例如:eqfield 定义字段间的相等(eq)约束。如果是更深层次的字段,在 field 之前还需要加上 cs(Cross-Struct),eq 就变为了 eqcsfield。
eqfield=Field:必须等于 Field 的值。
nefield=Field:必须不等于 Field 的值。
gtfield=Field:必须大于 Field 的值。
gtefield=Field: 必须大于等于 Field 的值。
ltfield=Field:必须小于 Field 的值。
ltefield=Field:必须小于等于 Field 的值。
eqcsfield=Other.Field:必须等于 struct Other 中 Field 的值。
necsfield=Other.Field:必须不等于 struct Other 中 Field 的值。
gtcsfield=Other.Field:必须大于 struct Other 中 Field 的值;
gtecsfield=Other.Field:必须大于等于 struct Other 中 Field 的值。
ltcsfield=Other.Field:必须小于 struct Other 中 Field 的值。
ltecsfield=Other.Field:必须小于等于 struct Other 中 Field 的值。
另外还有几个常用的 Tag:
required_with=Field1 Field2:在 Field1 或者 Field2 存在时,必须;
required_with_all=Field1 Field2:在 Field1 与 Field2 都存在时,必须;
required_without=Field1 Field2:在 Field1 或者 Field2 不存在时,必须;
required_without_all=Field1 Field2:在 Field1 与 Field2 都存在时,必须;
通过看源码,我们可以看到validator 返回的错误有两种,一种是参数错误,一种是校验错误,它们都实现了 error 接口。
参数错误时,返回 InvalidValidationError 类型;
校验错误时,返回 ValidationErrors 类型。ValidationErrors 是一个错误切片,保存了每个字段违反的每个约束信息。
所以 validator 校验返回的结果有 3 种情况:
nil:没有错误;
InvalidValidationError:输入参数错误;
ValidationErrors:字段违反约束。
validator 返回的错误有两种,一种是参数错误,一种是校验错误,它们都实现了 error 接口。
参数错误时,返回 InvalidValidationError 类型;
校验错误时,返回 ValidationErrors 类型。ValidationErrors 是一个错误切片,保存了每个字段违反的每个约束信息。
所以 validator 校验返回的结果只有 3 种情况:
nil:没有错误;
InvalidValidationError:输入参数错误;
ValidationErrors:字段违反约束。
我们可以在程序中判断 err != nil
时,可以依次将 err转换为 InvalidValidationError
和 ValidationErrors
以获取更详细的信息:
err := validate.Struct(user) if err != nil { invalid, ok := err.(*validator.InvalidValidationError) if ok { fmt.Println("param error:", invalid) return } validationErrs := err.(validator.ValidationErrors) for _, validationErr := range validationErrs { fmt.Println(validationErr) } }
读到这里,这篇“Golang验证器之validator怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。