欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang中validator包的使用教程

 更新時間:2023年09月10日 11:29:19   作者:阿兵云原生  
Validator 實際上是一個驗證工具,屬于 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:如果字段未設置,則忽略它

各種格式約束如

  • email
  • 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ā)環(huán)境搭建過程圖文詳解

    GO語言開發(fā)環(huán)境搭建過程圖文詳解

    這篇文章主要介紹了GO語言開發(fā)環(huán)境搭建過程圖文詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • goland 清除所有的默認設置操作

    goland 清除所有的默認設置操作

    這篇文章主要介紹了goland 清除所有的默認設置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 提升Go語言開發(fā)效率的小技巧實例(GO語言語法糖)匯總

    提升Go語言開發(fā)效率的小技巧實例(GO語言語法糖)匯總

    這篇文章主要介紹了提升Go語言開發(fā)效率的小技巧匯總,也就是Go語言的語法糖,掌握好這些可以提高我們的開發(fā)效率,需要的朋友可以參考下
    2022-11-11
  • go語言題解LeetCode1128等價多米諾骨牌對的數量

    go語言題解LeetCode1128等價多米諾骨牌對的數量

    這篇文章主要為大家介紹了go語言題解LeetCode1128等價多米諾骨牌對的數量示例詳解,
    2022-12-12
  • go語言操作es的實現示例

    go語言操作es的實現示例

    本文主要介紹了go語言操作es的實現示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 使用go語言將單反斜杠改為雙反斜杠的方法

    使用go語言將單反斜杠改為雙反斜杠的方法

    最近開發(fā)的時候遇到這么個問題,就是在window上獲取了文件目錄的字段,然后將這個絕對路徑保存到數據庫,但是前端展示的時候路徑的雙反斜杠變成了單反斜杠,本文給大家介紹了使用go語言將單反斜杠改為雙反斜杠的方法,需要的朋友可以參考下
    2024-01-01
  • Go map定義的方式及修改技巧

    Go map定義的方式及修改技巧

    這篇文章主要給大家介紹了關于Go map定義的方式及修改技巧,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Golang中類型轉換利器cast庫的用法詳解

    Golang中類型轉換利器cast庫的用法詳解

    cast庫是一個簡潔而強大的第三方庫,它的主要功能是實現類型之間的安全轉換,而在Golang開發(fā)中,類型轉換是一個常見且不可避免的過程,下面我們就來看看cast庫在Golang中的具體應用吧
    2024-11-11
  • 一些關于Go程序錯誤處理的相關建議

    一些關于Go程序錯誤處理的相關建議

    錯誤處理在每個語言中都是一項重要內容,眾所周知,通常寫程序時遇到的分為異常與錯誤兩種,Golang中也不例外,這篇文章主要給大家介紹了一些關于Go程序錯誤處理的相關建議,需要的朋友可以參考下
    2021-09-09
  • goland 實現websocket server的示例代碼

    goland 實現websocket server的示例代碼

    本文主要介紹了goland 實現websocket server的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06

最新評論