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")
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。