您的位置 首页 > 德语词汇

validator是什麼意思?golang常用库:字段参数验证库validator

大家好,validator是什麼意思相信很多的网友都不是很明白,包括golang常用库:字段参数验证库validator也是一样,不过没有关系,接下来就来为大家分享关于validator是什麼意思和golang常用库:字段参数验证库validator的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

在平常开发中,特别是在web应用开发中,为了验证输入字段的合法性,都会做一些验证操作。比如对用户提交的表单字段进行验证,或者对请求的API接口字段进行验证,验证字段的合法性,保证输入字段值的安全,防止用户的恶意请求。

validator是什麼意思?golang常用库:字段参数验证库validator

一般的做法是用正则表达式,一个字段一个字段的进行验证。一个一个字段验证的话,写起来比较繁琐。那有没更好的方法,进行字段的合法性验证?有,这就是下面要介绍的validator这个验证组件。

代码地址:https://github.com/go-playground/validator

文档地址:https://github.com/go-playground/validator/blob/master/README.md

这个验证包github.com/go-playground/validator验证功能非常多。

doc:https://github.com/go-playground/validator/blob/master/README.md#comparisons

范围验证:切片、数组和map、字符串,验证其长度;数值,验证大小范围

CopytypeUserstruct{\nNamestring`json:"name"validate:"min=0,max=35"`\nAgeunit8`json:"age"validate:"lte=90,gte=0"`\n}\n

更多功能请参看文档validatorcomparisonsdoc

doc:https://github.com/go-playground/validator/blob/master/README.md#strings

CopytypeUserstruct{\nNamestring`validate:"contains=tom"`\nAgeint`validate:"min=1"`\n}\n

更多功能请参看文档validatorstringsdoc

doc:https://github.com/go-playground/validator/blob/master/README.md#fields

CopytypeStruct1struct{\nField1string`validate:eqcsfield=Struct2.Field2`\nStruct2struct{\nField2string\n}\n}\nnecsfield:跨不同结构体字段不相等eqfield:同一结构体字段验证相等,最常见的就是输入2次密码验证

CopytypeUserstruct{\nNamestring`validate:"lte=4"`\nAgeint`validate:"min=20"`\nPasswordstring`validate:"min=10"`\nPassword2string`validate:"eqfield=Password"`\n}\nnefield:同一结构体字段验证不相等

CopytypeUserstruct{\nNamestring`validate:"lte=4"`\nAgeint`validate:"min=20"`\nPasswordstring`validate:"min=10,nefield=Name"`\n}\ngtefield:大于等于同一结构体字段,validate:"gtefiled=Field2"ltefield:小于等于同一结构体字段

更多功能请参看文档:validatorFieldsDOC

doc:https://github.com/go-playground/validator/blob/master/README.md#network

更多功能请参看文档:validatornetworkDOC

doc:https://github.com/go-playground/validator/blob/master/README.md#format

更多功能请参看文档validatorstringsdoc

请参看文档:https://github.com/go-playground/validator/blob/master/README.md#other

gogetgithub.com/go-playground/validator/v10

import"github.com/go-playground/validator/v10"

文档:https://github.com/go-playground/validator/blob/master/README.md#examples

Copypackagemain\n\nimport(\n\t"fmt"\n\n\t"github.com/go-playground/validator/v10"\n)\n\nfuncmain(){\n\tvalidate:=validator.New()\n\n\tvarboolTestbool\n\terr:=validate.Var(boolTest,"required")\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n\tvarstringTeststring=""\n\terr=validate.Var(stringTest,"required")\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n\n\tvaremailTeststring="test@126.com"\n\terr=validate.Var(emailTest,"email")\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}else{\n\t\tfmt.Println("success")//输出:success。说明验证成功\n\t}\n\n\temailTest2:="test.126.com"\n\terrs:=validate.Var(emailTest2,"required,email")\n\tiferrs!=nil{\n\t\tfmt.Println(errs)//输出:Key:""Error:Fieldvalidationfor""failedonthe"email"tag。验证失败\n\t}\n\n\tfmt.Println("\\r\\nEnd!!")\n\n\n}\n

运行输出:

gorunsimple1.goKey:''Error:Fieldvalidationfor''failedonthe'required'tagKey:''Error:Fieldvalidationfor''failedonthe'required'tagsuccessKey:''Error:Fieldvalidationfor''failedonthe'email'tag

validation_struct.go,这个程序还列出了效验出错字段的一些信息,

Copypackagemain\n\nimport(\n\t"fmt"\n\n\t"github.com/go-playground/validator/v10"\n)\n\ntypeUserstruct{\n\tFirstNamestring`validate:"required"`\n\tLastNamestring`validate:"required"`\n\tAgeuint8`validate:"gte=0,lte=130"`\n\tEmailstring`validate:"required,email"`\n\tAddresses[]*Address`validate:"required,dive,required"`\n}\n\ntypeAddressstruct{\n\tStreetstring`validate:"required"`\n\tCitystring`validate:"required"`\n\tPlanetstring`validate:"required"`\n\tPhonestring`validate:"required"`\n}\n\nfuncmain(){\n\taddress:=&Address{\n\t\tStreet:"EavesdownDocks",\n\t\tPlanet:"Persphone",\n\t\tPhone:"none",\n\t}\n\n\tuser:=&User{\n\t\tFirstName:"Badger",\n\t\tLastName:"Smith",\n\t\tAge:135,\n\t\tEmail:"Badger.Smith@gmail.com",\n\t\tAddresses:[]*Address{address},\n\t}\n\n\tvalidate:=validator.New()\n\terr:=validate.Struct(user)\n\tiferr!=nil{\n\t\tfmt.Println("===errormsg====")\n\t\tfmt.Println(err)\n\n\t\tif_,ok:=err.(*validator.InvalidValidationError);ok{\n\t\t\tfmt.Println(err)\n\t\t\treturn\n\t\t}\n\n\t\tfmt.Println("\\r\\n===========errorfieldinfo====================")\n\t\tfor_,err:=rangeerr.(validator.ValidationErrors){\n//列出效验出错字段的信息\n\t\t\tfmt.Println("Namespace:",err.Namespace())\n\t\t\tfmt.Println("Fild:",err.Field())\n\t\t\tfmt.Println("StructNamespace:",err.StructNamespace())\n\t\t\tfmt.Println("StructField:",err.StructField())\n\t\t\tfmt.Println("Tag:",err.Tag())\n\t\t\tfmt.Println("ActualTag:",err.ActualTag())\n\t\t\tfmt.Println("Kind:",err.Kind())\n\t\t\tfmt.Println("Type:",err.Type())\n\t\t\tfmt.Println("Value:",err.Value())\n\t\t\tfmt.Println("Param:",err.Param())\n\t\t\tfmt.Println()\n\t\t}\n\n\t\t//fromhereyoucancreateyourownerrormessagesinwhateverlanguageyouwish\n\t\treturn\n\t}\n}\n

运行输出:

$gorunvalidation_struct.go===errormsg====Key:'User.Age'Error:Fieldvalidationfor'Age'failedonthe'lte'tagKey:'User.Addresses[0].City'Error:Fieldvalidationfor'City'failedonthe'required'tag

===========errorfieldinfo====================Namespace:User.AgeFild:AgeStructNamespace:User.AgeStructField:AgeTag:lteActualTag:lteKind:uint8Type:uint8Value:135Param:130

Namespace:User.Addresses[0].CityFild:CityStructNamespace:User.Addresses[0].CityStructField:CityTag:requiredActualTag:requiredKind:stringType:stringValue:Param:

还可以给字段加一些其他tag信息,方面form,json的解析,如下:

CopytypeUserstruct{\nFirstNamestring`form:"firstname"json:"firstname"validate:"required"`\n\tLastNamestring`form:"lastname"json:"lastname"validate:"required"`\n\tAgeuint8`form:"age"json:"age"validate:"gte=0,lte=130"`\n\tEmailstring`form:"email"json:"email"validate:"required,email"`\n}\n例子2.2:验证slicemap#slice#

slice验证中用到一个tag关键字dive,意思深入一层验证。

Copypackagemain\n\nimport(\n\t"fmt"\n\n\t"github.com/go-playground/validator/v10"\n)\n\nfuncmain(){\n\tsliceone:=[]string{"123","onetwothree","myslicetest","four","five"}\n\n\tvalidate:=validator.New()\n\terr:=validate.Var(sliceone,"max=15,dive,min=4")\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n\n\tslicetwo:=[]string{}\n\terr=validate.Var(slicetwo,"min=4,dive,required")\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n}\n

运行输出:

$gorunvalidate_slice.goKey:'[0]'Error:Fieldvalidationfor'[0]'failedonthe'min'tagKey:''Error:Fieldvalidationfor''failedonthe'min'tag

Copysliceone:=[]string{"123","onetwothree","myslicetest","four","five"}\nvalidate.Var(sliceone,"max=15,dive,min=4")\n

第二个参数中tag关键字dive前面的max=15,验证[],也就是验证slice的长度,dive后面的min=4,验证slice里的值长度,也就是说dive后面的tag验证slice的值

那如果是二维slice验证呢?如:

Copyslicethree:=[][]string{}\nvalidate.Var(slicethree,"min=2,dive,len=2,dive,required")\n\nvalidate.Var(slicethree,"min=2,dive,dive,required")\n

说明:

这里有2个dive,刚好深入到二维slice,但他们也有不同之处,第二个表达式的第一个dive后没有设置tag。第一个验证表达式:min=2:验证第一个[]方括号的值长度;len=2:验证第二个[]string长度;required:验证slice里的值

第二个验证表达式:min=2:验证第一个[]方括号的值长度;dive:后没有设置tag值,不验证第二个[]string;required:验证slice里的值

map的验证中也需要tag关键字dive,另外,它还有keys和endkeys两tag,验证这2个tag之间map的key,而不是value值。

Copypackagemain\n\nimport(\n\t"fmt"\n\n\t"github.com/go-playground/validator/v10"\n)\n\nfuncmain(){\n\tvarmaponemap[string]string\n\n\tmapone=map[string]string{"one":"jimmmy","two":"tom","three":""}\n\n\tvalidate:=validator.New()\n\terr:=validate.Var(mapone,"gte=3,dive,keys,eq=1|eq=2,endkeys,required")\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n}\n

运行输出:

$gorunvalidate_map.goKey:'[three]'Error:Fieldvalidationfor'[three]'failedonthe'eq=1|eq=3'tagKey:'[three]'Error:Fieldvalidationfor'[three]'failedonthe'required'tagKey:'[one]'Error:Fieldvalidationfor'[one]'failedonthe'eq=1|eq=3'tagKey:'[two]'Error:Fieldvalidationfor'[two]'failedonthe'eq=1|eq=3'tag

gte=3:验证map自己的长度;dive后的keys,eq=1|eq=2,endkeys:验证map的keys个数,也就是验证[]里值。上例中定义了一个string,所以明显报了3个错误。required:验证map的值value

那嵌套map怎么验证?如:map[[3]string]string,和上面slice差不多,使用多个dive

Copyvarmaptwomap[[3]string]string{}\nvalidate.Var(maptwo,"gte=3,dive,keys,dive,eq=1|eq=3,endkeys,required")\n

说明:

gte=3:验证map的长度;keys,dive,eq=1|eq=3,endkeys:keys和endkeys中有一个dive(深入一级),验证map中key的数组每一个值required:验证map的值

用户自定义函数验证字段是否合法,效验是否正确。

Copypackagemain\n\nimport(\n\t"fmt"\n\n\t"github.com/go-playground/validator/v10"\n)\n\ntypeUserstruct{\n\tNamestring`form:"name"json:"name"validate:"required,CustomerValidation"`//注意:required和CustomerValidation之间不能有空格,否则panic。CustomerValidation:自定义tag-函数标签\n\tAgeuint8`form:"age"json:"age"validate:"gte=0,lte=80"`//注意:gte=0和lte=80之间不能有空格,否则panic\n}\n\nvarvalidate*validator.Validate\n\nfuncmain(){\n\tvalidate=validator.New()\n\tvalidate.RegisterValidation("CustomerValidation",CustomerValidationFunc)//注册自定义函数,前一个参数是struct里tag自定义,后一个参数是自定义的函数\n\n\tuser:=&User{\n\t\tName:"jimmy",\n\t\tAge:86,\n\t}\n\n\tfmt.Println("firstvalue:",user)\n\terr:=validate.Struct(user)\n\tiferr!=nil{\n\t\tfmt.Printf("Err(s):\\n%+v\\n",err)\n\t}\n\n\tuser.Name="tom"\n\tuser.Age=29\n\tfmt.Println("secondvalue:",user)\n\terr=validate.Struct(user)\n\tiferr!=nil{\n\t\tfmt.Printf("Err(s):\\n%+v\\n",err)\n\t}\n}\n\n//自定义函数\nfuncCustomerValidationFunc(f1validator.FieldLevel)bool{\n//f1包含了字段相关信息\n//f1.Field()获取当前字段信息\n//f1.Param()获取tag对应的参数\n//f1.FieldName()获取字段名称\n\n\treturnf1.Field().String()=="jimmy"\n}\n

运行输出:

$goruncustomer.gofirstvalue:&{jimmy86}Err(s):Key:'User.Age'Error:Fieldvalidationfor'Age'failedonthe'lte'tagsecondvalue:&{tom29}Err(s):Key:'User.Name'Error:Fieldvalidationfor'Name'failedonthe'CustomerValidation'tag

上面代码userstruct定义中,validate里的required和CustomerValidation之间不能有空格,否则运行时报panic错误:panic:Undefinedvalidationfunction'CustomerValidation'onfield'Name'

不通过字段tag自定义函数,直接注册函数。

https://github.com/go-playground/validator/blob/master/_examples/struct-level/main.go

Copypackagemain\n\nimport(\n\t"fmt"\n\n\t"github.com/go-playground/validator/v10"\n)\n\ntypeUserstruct{\n\tFirstNamestring`json:firstname`\n\tLastNamestring`json:lastname`\n\tAgeuint8`validate:"gte=0,lte=130"`\n\tEmailstring`validate:"required,email"`\n\tFavouriteColorstring`validate:"hexcolor|rgb|rgba"`\n}\n\nvarvalidate*validator.Validate\n\nfuncmain(){\n\tvalidate=validator.New()\n\n\tvalidate.RegisterStructValidation(UserStructLevelValidation,User{})\n\n\tuser:=&User{\n\t\tFirstName:"",\n\t\tLastName:"",\n\t\tAge:30,\n\t\tEmail:"TestFunc@126.com",\n\t\tFavouriteColor:"#000",\n\t}\n\n\terr:=validate.Struct(user)\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n}\n\nfuncUserStructLevelValidation(slvalidator.StructLevel){\n\tuser:=sl.Current().Interface().(User)\n\n\tiflen(user.FirstName)==0&&len(user.LastName)==0{\n\t\tsl.ReportError(user.FirstName,"FirstName","firstname","firstname","")\n\t\tsl.ReportError(user.LastName,"LastName","lastname","lastname","")\n\t}\n}\n

运行输出:

$goruncustomer1.goKey:'User.FirstName'Error:Fieldvalidationfor'FirstName'failedonthe'firstname'tagKey:'User.LastName'Error:Fieldvalidationfor'LastName'failedonthe'lastname'tag

https://github.com/go-playground/validator/blob/master/_examples/custom/main.go

validate.RegisterCustomTypeFunc:验证类型的自定义函数

Copypackagemain\n\nimport(\n\t"database/sql"\n\t"database/sql/driver"\n\t"fmt"\n\t"reflect"\n\n\t"github.com/go-playground/validator/v10"\n)\n\ntypeDbBackedUserstruct{\n\tNamesql.NullString`validate:"required"`\n\tAgesql.NullInt64`validate:"required"`\n}\n\nvarvalidate*validator.Validate\n\nfuncmain(){\n\tvalidate=validator.New()\n\n\tvalidate.RegisterCustomTypeFunc(ValidateValuer,sql.NullString{},sql.NullInt64{},sql.NullBool{},sql.NullFloat64{})\n\n\t//buildobjectforvalidation\n\tx:=DbBackedUser{Name:sql.NullString{String:"",Valid:true},Age:sql.NullInt64{Int64:0,Valid:false}}\n\n\terr:=validate.Struct(x)\n\tiferr!=nil{\n\t\tfmt.Printf("Err(s):\\n%+v\\n",err)\n\t}\n}\n\nfuncValidateValuer(fieldreflect.Value)interface{}{\n\tifvaluer,ok:=field.Interface().(driver.Valuer);ok{\n\t\tval,err:=valuer.Value()\n\t\tiferr==nil{\n\t\t\treturnval\n\t\t}\n\t\t//handletheerrorhowyouwant\n\t}\n\treturnnil\n}\n

运行输出:

$goruncustomer.goErr(s):Key:'DbBackedUser.Name'Error:Fieldvalidationfor'Name'failedonthe'required'tagKey:'DbBackedUser.Age'Error:Fieldvalidationfor'Age'failedonthe'required'tag

注意,这个函数:RegisterCustomTypeFunc,它上面有2行注释:

//RegisterCustomTypeFuncregistersaCustomTypeFuncagainstanumberoftypes////NOTE:thismethodisnotthread-safeitisintendedthattheseallberegisteredpriortoanyvalidation

它是一个验证数据类型自定义函数,NOTE:这个方法不是线程安全的

两个字段比较,有一种是密码比较验证,用户注册时候验证2次密码输入是否相同。用tageqfield比较两字段。。

Copypackagemain\n\nimport(\n\t"fmt"\n\n\t"github.com/go-playground/validator/v10"\n)\n\n//注册用户userstruct\ntypeUserstruct{\n\tUserNamestring`json:"username"validate:"lte=14,gte=4"`\n\tPasswordstring`json:"password"validate:"max=20,min=6"`\n\tPassword2string`json:"password2"validate:"eqfield=Password"`\n}\n\nfuncmain(){\n\tvalidate:=validator.New()\n\n\tuser1:=User{\n\t\tUserName:"jim",\n\t\tPassword:"123456",\n\t\tPassword2:"12345",\n\t}\n\tfmt.Println("validateuser1value:",user1)\n\terr:=validate.Struct(user1)\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n\n\tfmt.Println("====================")\n\n\tuser2:=User{\n\t\tUserName:"jimy",\n\t\tPassword:"123456",\n\t\tPassword2:"123456",\n\t}\n\tfmt.Println("validateuser2value:",user2)\n\terr=validate.Struct(user2)\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n}\n

运行输出:

$gorunverify_pwd.govalidateuser1value:{jim12345612345}Key:'User.UserName'Error:Fieldvalidationfor'UserName'failedonthe'gte'tagKey:'User.Password2'Error:Fieldvalidationfor'Password2'failedonthe'eqfield'tag====================validateuser2value:

还有一种是2变量字段比较,见下面例子eq_field.go:

Copypackagemain\n\nimport(\n\t"fmt"\n\n\t"github.com/go-playground/validator/v10"\n)\n\nfuncmain(){\n\tfield1:="tom"\n\tfield2:="jimmy"\n\n\tvalidate:=validator.New()\n\n\tfmt.Println("tagnefield:")\n\terr:=validate.VarWithValue(field1,field2,"nefield")\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}else{\n\t\tfmt.Println("correct")\n\t}\n\n\tfmt.Println("===========================")\n\n\tfmt.Println("tageqfield:")\n\terr=validate.VarWithValue(field1,field2,"eqfield")\n\tiferr!=nil{\n\t\tfmt.Println(err)\n\t}\n}\n

运行输出:

$goruneq_field.gotagnefield:correct===========================tageqfield:Key:''Error:Fieldvalidationfor''failedonthe'eqfield'tag

Copypackagemain\n\nimport(\n\t"fmt"\n\t"strings"\n\n\t"github.com/go-playground/locales/en"\n\t"github.com/go-playground/locales/zh"\n\tut"github.com/go-playground/universal-translator"\n\t"github.com/go-playground/validator/v10"\n\n\tzhtrans"github.com/go-playground/validator/v10/translations/zh"\n\t//entrans"github.com/go-playground/validator/v10/translations/en"\n)\n\ntypeStudentstruct{\n\tNamestring`validate:required`\n\tEmailstring`validate:"email"`\n\tAgeint`validate:"max=30,min=12"`\n}\n\nfuncmain(){\n\ten:=en.New()//英文翻译器\n\tzh:=zh.New()//中文翻译器\n\n\t//第一个参数是必填,如果没有其他的语言设置,就用这第一个\n\t//后面的参数是支持多语言环境(\n\t//uni:=ut.New(en,en)也是可以的\n\t//uni:=ut.New(en,zh,tw)\n\tuni:=ut.New(en,zh)\n\ttrans,_:=uni.GetTranslator("zh")//获取需要的语言\n\n\tstudent:=Student{\n\t\tName:"tom",\n\t\tEmail:"testemal",\n\t\tAge:40,\n\t}\n\tvalidate:=validator.New()\n\n\tzhtrans.RegisterDefaultTranslations(validate,trans)\n\n\terr:=validate.Struct(student)\n\tiferr!=nil{\n\t\t//fmt.Println(err)\n\n\t\terrs:=err.(validator.ValidationErrors)\n\t\tfmt.Println(removeStructName(errs.Translate(trans)))\n\t}\n}\n\nfuncremoveStructName(fieldsmap[string]string)map[string]string{\n\tresult:=map[string]string{}\n\n\tforfield,err:=rangefields{\n\t\tresult[field[strings.Index(field,".")+1:]]=err\n\t}\n\treturnresult\n}\n\n

运行输出:

$goruncustomer_err_info3.gomap[Age:Age必须小于或等于30Email:Email必须是一个有效的邮箱]

好了,关于validator是什麼意思和golang常用库:字段参数验证库validator的问题到这里结束啦,希望可以解决您的问题哈!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023