golang中validator包的使用教程
看到 validator 咱們第一反應(yīng)會想起啥?見名知意我就可以知道他是一個驗證器,如果用過 gin web 框架的同學(xué),自然是用過 gin 里面的 validator,只不過 gin 中使用的關(guān)鍵字是 binding 去做標(biāo)識
開門見山
Validator 實際上是一個驗證工具,屬于 golang 的第三方包,這個包中使用了各種反射技巧來提供了各種校驗和約束數(shù)據(jù)的方式方法,非常實用,常用的有這些:
基本的字段長度,大小,范圍的約束
- len:約束參數(shù)長度
- eq:數(shù)值等于參數(shù)值
- max:數(shù)值小于等于參數(shù)值
- min:數(shù)值大于等于參數(shù)值
- ne:不等于參數(shù)值
- gt:大于參數(shù)值,gte:大于等于參數(shù)值
- lt:小于參數(shù)值, lte:小于等于參數(shù)值
- oneof:只能是枚舉值中的一個,這些值必須是數(shù)值或字符串,以空格分隔,如果字符串中有空格,則使用單引號包圍。例如:oneof=changsha beijing haerbing
是否必選,是否跳過,是否忽略
- **-**:跳過該字段
- | :使用多個約束,只需要滿足其中一個,例如:xxx| xxx
- required:必選約束,不能為默認值
- omitempty:如果字段未設(shè)置,則忽略它
各種格式約束如
- url
- ip、ipv4、ipv6
- uuid
- datetime
- json
- file , 參數(shù)必須是一個合法的文件路徑
常用的大概有上述這些,我們也不需要去背,只需要知道如何去使用,以及咱們需要處理數(shù)據(jù)校驗的時候,能夠想到 validator 庫就行了,實在記不起來看官方文檔或者看本篇文章的例子就可以了,這個是官網(wǎng):
validator package - github.com/go-playground/validator/v10 - Go Packages
使用
使用 validator 工具, 自然是為了提高我們的開發(fā)效率以及讓我們寫出來的內(nèi)容更加優(yōu)雅和健壯
如果我們自己每一個字段都顯示的去校驗是否符合我們預(yù)期,那么代碼大概率會很臃腫,來一個簡單的 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 數(shù)據(jù)結(jié)構(gòu)中,對其成員進行了不同的約束,相信通過 xdm 看到 Data 結(jié)構(gòu)中的 validate 標(biāo)識后面的約束,就知道響應(yīng)字段的約束是啥意思了
例如
Age int `validate:"gte=18,lte=100"`
約束 Age 這個字段,需要滿足 大于等于 18 ,小于等于 100 的范圍
RePwd string `validate:"eqfield=NewPwd"`
RePwd 字段,需要和 NewPwd
字段相等 ,這個是用 eqfield
做標(biāo)識的
關(guān)于 xxfield 的跨字段約束的相關(guān)標(biāo)識可以查看官網(wǎng)的此處
這里是 valiator 能支持的所有類型,從字段內(nèi)容,網(wǎng)絡(luò)方面,字符串,數(shù)據(jù)結(jié)構(gòu),比較的字符,其他的標(biāo)識
另外關(guān)于郵箱約束的:
Email string `validate:"email"`
Email
字段,必須是 email 格式的,才能夠檢驗通過
如上,每一個字段,如果需要校驗的,校驗失敗,我們也可以全部打印出來
目前在 validator 中,處理錯誤信息,分為 2 種錯誤的情況:
InvalidValidationError
咱們將我們的 err 轉(zhuǎn)換成 InvalidValidationError ,表示輸入?yún)?shù)錯誤
ValidationErrors:字段違反約束,錯誤信息如下
咱們將我們的 err 轉(zhuǎn)換成 ValidationErrors,這是一個切片,所以咱們可以遍歷輸出,這個是表示不符合約束字符的有錯誤原因
validator.ValidationErrors 是一個 FieldError 類型的切片
type ValidationErrors []FieldError
FieldError
中包含了關(guān)于 error 的全部信息,我們可以調(diào)用 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 }
關(guān)于其他標(biāo)識的使用就不過多贅述了,使用方式都大同小異,咱們可以參考上述的 demo 即可
自定義約束
當(dāng)然,如果認為官方提供的支持的標(biāo)識還不能滿足我們的要求,那么我們也是可以自定義咱們的標(biāo)識的,例如,咱們要定義的標(biāo)識是 happyhead
,含義就是,咱們定義的字符串,必須是以 happy 開頭的,否則就校驗不通過
此時咱們就需要使用到 validator 包中的 RegisterValidation 方法,再按照這個方法,提供一個校驗實際參數(shù)的回調(diào)函數(shù)即可:
我們就可以這樣來寫
查看實際效果如下:
demo1?validate?failed?:??Key:?'RegisterFormat.Name'?Error:Field?validation?for?'Name'?failed?on?the?'happyhead'?tag demo2?validate?success?...
至此,咱們將 validator 包中的特殊約束,格式約束,錯誤處理,范圍約束,字符串約束,以及自定義約束都簡單過了一下,這些東西不需要朗讀和背誦,只需要咱們知道有他,需要的時候,能夠找到,能夠迅速使用起來即可
當(dāng)然,如果想研究他的實現(xiàn)原理的,可以好好看看 validator 源碼包以及官方文檔,還是非常有意思的
以上就是golang中validator包的使用教程的詳細內(nèi)容,更多關(guān)于golang validator包的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
提升Go語言開發(fā)效率的小技巧實例(GO語言語法糖)匯總
這篇文章主要介紹了提升Go語言開發(fā)效率的小技巧匯總,也就是Go語言的語法糖,掌握好這些可以提高我們的開發(fā)效率,需要的朋友可以參考下2022-11-11go語言題解LeetCode1128等價多米諾骨牌對的數(shù)量
這篇文章主要為大家介紹了go語言題解LeetCode1128等價多米諾骨牌對的數(shù)量示例詳解,2022-12-12Golang中類型轉(zhuǎn)換利器cast庫的用法詳解
cast庫是一個簡潔而強大的第三方庫,它的主要功能是實現(xiàn)類型之間的安全轉(zhuǎn)換,而在Golang開發(fā)中,類型轉(zhuǎn)換是一個常見且不可避免的過程,下面我們就來看看cast庫在Golang中的具體應(yīng)用吧2024-11-11goland 實現(xiàn)websocket server的示例代碼
本文主要介紹了goland 實現(xiàn)websocket server的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06