golang之数据校验的实现代码示例
程序员文章站
2022-04-28 17:20:37
目前大都是使用
安装
go get gopkg.in/go-playground/validator.v9
原理
当然只能通过反射来实现了,之前...
目前大都是使用
安装
go get gopkg.in/go-playground/validator.v9
原理
当然只能通过反射来实现了,之前写过一篇反射的文章 ,里面有写到怎么通过反射获取struct tag。
读取struct tag之后就是对里面的标识符进行识别,然后进行验证了。具体可以去看源码。
demo
简单使用:
package main import ( "fmt" "gopkg.in/go-playground/validator.v9" ) // user contains user information type userinfo struct { firstname string `validate:"required"` lastname string `validate:"required"` age uint8 `validate:"gte=0,lte=100"` email string `validate:"required,email"` } func main() { validate := validator.new() user := &userinfo{ firstname: "badger", lastname: "smith", age: 105, email: "", } err := validate.struct(user) if err != nil { for _, err := range err.(validator.validationerrors) { fmt.println(err) } return } fmt.println("success") }
输出:
key: 'userinfo.age' error:field validation for 'age' failed on the 'lte' tag
key: 'userinfo.email' error:field validation for 'email' failed on the 'required' tag
其它类型可以参照文档
几个例子:
1.ip type userinfo struct { ip string `validate:"ip"` } 2.数字 type userinfo struct { number float32 `validate:"numeric"` } 3.最大值 type userinfo struct { number float32 `validate:"max=10"` } 4.最小值 type userinfo struct { number float32 `validate:"min=10"` }
自定义验证函数
package main import ( "fmt" "gopkg.in/go-playground/validator.v9" "unicode/utf8" ) // user contains user information type userinfo struct { name string `validate:"checkname"` number float32 `validate:"numeric"` } // 自定义验证函数 func checkname(fl validator.fieldlevel) bool { count := utf8.runecountinstring(fl.field().string()) fmt.printf("length: %v \n", count) if count > 5 { return false } return true } func main() { validate := validator.new() //注册自定义函数,与struct tag关联起来 err := validate.registervalidation("checkname", checkname) user := &userinfo{ name: "我是中国人,我爱自己的祖国", number: 23, } err = validate.struct(user) if err != nil { for _, err := range err.(validator.validationerrors) { fmt.println(err) } return } fmt.println("success") }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。