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