golang之数据校验的实现代码示例
目前大都是使用 validator
安装
gogetgopkg.in/go-playground/validator.v9
原理
当然只能通过反射来实现了,之前写过一篇反射的文章 golang之反射和断言,里面有写到怎么通过反射获取structtag。
读取structtag之后就是对里面的标识符进行识别,然后进行验证了。具体可以去看源码。
demo
简单使用:
packagemain import( "fmt" "gopkg.in/go-playground/validator.v9" ) //Usercontainsuserinformation typeUserInfostruct{ FirstNamestring`validate:"required"` LastNamestring`validate:"required"` Ageuint8`validate:"gte=0,lte=100"` Emailstring`validate:"required,email"` } funcmain(){ validate:=validator.New() user:=&UserInfo{ FirstName:"Badger", LastName:"Smith", Age:105, Email:"", } err:=validate.Struct(user) iferr!=nil{ for_,err:=rangeerr.(validator.ValidationErrors){ fmt.Println(err) } return } fmt.Println("success") }
输出:
Key:'UserInfo.Age'Error:Fieldvalidationfor'Age'failedonthe'lte'tag
Key:'UserInfo.Email'Error:Fieldvalidationfor'Email'failedonthe'required'tag
其它类型可以参照文档 https://godoc.org/gopkg.in/go-playground/validator.v9
几个例子:
1.IP typeUserInfostruct{ Ipstring`validate:"ip"` } 2.数字 typeUserInfostruct{ Numberfloat32`validate:"numeric"` } 3.最大值 typeUserInfostruct{ Numberfloat32`validate:"max=10"` } 4.最小值 typeUserInfostruct{ Numberfloat32`validate:"min=10"` }
自定义验证函数
packagemain import( "fmt" "gopkg.in/go-playground/validator.v9" "unicode/utf8" ) //Usercontainsuserinformation typeUserInfostruct{ Namestring`validate:"checkName"` Numberfloat32`validate:"numeric"` } //自定义验证函数 funccheckName(flvalidator.FieldLevel)bool{ count:=utf8.RuneCountInString(fl.Field().String()) fmt.Printf("length:%v\n",count) ifcount>5{ returnfalse } returntrue } funcmain(){ validate:=validator.New() //注册自定义函数,与structtag关联起来 err:=validate.RegisterValidation("checkName",checkName) user:=&UserInfo{ Name:"我是中国人,我爱自己的祖国", Number:23, } err=validate.Struct(user) iferr!=nil{ for_,err:=rangeerr.(validator.ValidationErrors){ fmt.Println(err) } return } fmt.Println("success") }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。