看到 validator 咱们第一反馈会想起啥?见名知意我就能够晓得他是一个验证器,如果用过 gin web 框架的同学,天然是用过 gin 外面的 validator,只不过 gin 中应用的关键字是 binding 去做标识
单刀直入
Validator 实际上是一个验证工具,属于 golang 的第三方包,这个包中应用了各种反射技巧来提供了各种校验和束缚数据的形式办法,十分实用,罕用的有这些:
-
根本的字段长度,大小,范畴的束缚
- len:束缚参数长度
- eq:数值等于参数值
- max:数值小于等于参数值
- min:数值大于等于参数值
- ne:不等于参数值
- gt:大于参数值,gte:大于等于参数值
- lt:小于参数值,lte:小于等于参数值
- oneof:只能是枚举值中的一个,这些值必须是数值或字符串,以空格分隔,如果字符串中有空格,则应用单引号突围。例如:oneof=changsha beijing haerbing
<!—->
-
是否必选,是否跳过,是否疏忽
- –:跳过该字段
- |:应用多个束缚,只须要满足其中一个,例如:xxx| xxx
- required:必选束缚,不能为默认值
- omitempty:如果字段未设置,则疏忽它
<!—->
-
各种格局束缚如
- url
- ip、ipv4、ipv6
- uuid
- datetime
- json
- file, 参数必须是一个非法的文件门路
罕用的大略有上述这些,咱们也不须要去背,只须要晓得如何去应用,以及咱们须要解决数据校验的时候,可能想到 validator 库就行了,切实记不起来看官网文档或者看本篇文章的例子就能够了,这个是官网:
validator package – github.com/go-playground/validator/v10 – Go Packages
应用
应用 validator 工具, 天然是为了进步咱们的开发效率以及让咱们写进去的内容更加优雅和强壮
如果咱们本人每一个字段都显示的去校验是否合乎咱们预期,那么代码大概率会很臃肿,来一个简略的 demo,举个栗子
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type Data struct {
City string `validate:"min=8,max=15"`
Name string `validate:"min=6,max=10"`
Addr string `validate:"url"`
Age int `validate:"gte=18,lte=100"`
Tall int `validate:"required"`
IpAddr string `validate:"ipv4"`
Email string `validate:"email"`
Content string `validate:"json"`
CreateTime string `validate:"datetime=2006-01-02"`
NewPwd string `validate:"min=8"`
RePwd string `validate:"eqfield=NewPwd"`
}
func main() {
// 示例,根本应用介绍
validate := validator.New()
demo1 := Data{
City: "changsha11111111111111",
Name: "xiaozhu",
Addr: "xxxxxxxxx",
Age: 25,
Tall: 185,
IpAddr: "xxxxxxxxxxx",
Email: "helloworld@qq.com",
Content: "{"name":"xiaozhu"}",
CreateTime: "xxxxx2006-03-02",
NewPwd: "12345",
RePwd: "123456789xxxxx",
}
err := validate.Struct(demo1)
if err == nil {fmt.Println("params check success")
return
}
invalid, ok := err.(*validator.InvalidValidationError)
if ok {fmt.Println("param invalid :", invalid)
return
}
valiErrs := err.(validator.ValidationErrors)
for _, valiErr := range valiErrs {fmt.Println(valiErr)
}
}
此处咱们能够看到咱们在 Data 数据结构中,对其成员进行了不同的束缚,置信通过 xdm 看到 Data 构造中的 validate 标识前面的束缚,就晓得响应字段的束缚是啥意思了
例如
Age int `validate:"gte=18,lte=100"`
束缚 Age 这个字段,须要满足 大于等于 18,小于等于 100 的范畴
RePwd string `validate:"eqfield=NewPwd"`
RePwd 字段,须要和 NewPwd
字段相等,这个是用 eqfield
做标识的
对于 xxfield 的跨字段束缚的相干标识能够查看官网的此处
这里是 valiator 能反对的所有类型,从字段内容,网络方面,字符串,数据结构,比拟的字符,其余的标识
另外对于邮箱束缚的:
Email string `validate:"email"`
Email
字段,必须是 email 格局的,才可能测验通过
如上,每一个字段,如果须要校验的,校验失败,咱们也能够全副打印进去
目前在 validator 中,处理错误信息,分为 2 种谬误的状况:
- InvalidValidationError
咱们将咱们的 err 转换成 InvalidValidationError,示意输出参数谬误
- ValidationErrors:字段违反束缚,错误信息如下
咱们将咱们的 err 转换成 ValidationErrors,这是一个切片,所以咱们能够遍历输入,这个是示意不合乎束缚字符的有谬误起因
validator.ValidationErrors 是一个 FieldError 类型的切片
type ValidationErrors []FieldError
FieldError
中蕴含了对于 error 的全副信息,咱们能够调用 FieldError
外面的成员办法进行输入即可
type FieldError interface {Tag() string
ActualTag() string
Namespace() string
StructNamespace() string
Field() string
StructField() string
Value() interface{}
Param() string
Kind() reflect.Kind
Type() reflect.Type
Translate(ut ut.Translator) string
Error() string}
对于其余标识的应用就不过多赘述了,应用形式都大同小异,咱们能够参考上述的 demo 即可
自定义束缚
当然,如果认为官网提供的反对的标识还不能满足咱们的要求,那么咱们也是能够自定义咱们的标识的,例如,咱们要定义的标识是 happyhead
,含意就是,咱们定义的字符串,必须是以 happy 结尾的,否则就校验不通过
此时咱们就须要应用到 validator 包中的 RegisterValidation 办法,再依照这个办法,提供一个校验理论参数的回调函数即可:
咱们就能够这样来写
查看实际效果如下:
demo1 validate failed : Key: 'RegisterFormat.Name' Error:Field validation for 'Name' failed on the 'happyhead' tag
demo2 validate success ...
至此,咱们将 validator 包中的非凡束缚,格局束缚,错误处理,范畴束缚,字符串束缚,以及自定义束缚都简略过了一下,这些货色不须要朗诵和背诵,只须要咱们晓得有他,须要的时候,可能找到,可能迅速应用起来即可
当然,如果想钻研他的实现原理的,能够好好看看 validator 源码包以及官网文档,还是十分有意思的
感激浏览,欢送交换,点个赞,关注一波 再走吧
欢送点赞,关注,珍藏
敌人们,你的反对和激励,是我保持分享,提高质量的能源
好了,本次就到这里
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是 阿兵云原生,欢送点赞关注珍藏,下次见~