最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang中validator包的使用教程

 更新時間:2023年09月10日 11:29:19   作者:阿兵云原生  
Validator 實際上是一個驗證工具,屬于 golang 的第三方包,這個包中使用了各種反射技巧來提供了各種校驗和約束數(shù)據(jù)的方式方法,下面就跟隨小編一起來學習一下validator包的使用吧

看到 validator 咱們第一反應(yīng)會想起啥?見名知意我就可以知道他是一個驗證器,如果用過 gin web 框架的同學,自然是用過 gin 里面的 validator,只不過 gin 中使用的關(guān)鍵字是 binding 去做標識

開門見山

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è)置,則忽略它

各種格式約束如

  • email
  • 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 標識后面的約束,就知道響應(yīng)字段的約束是啥意思了

例如

Age int `validate:"gte=18,lte=100"`

約束 Age 這個字段,需要滿足 大于等于 18 ,小于等于 100 的范圍

RePwd string `validate:"eqfield=NewPwd"`

RePwd 字段,需要和 NewPwd 字段相等 ,這個是用 eqfield 做標識的

關(guān)于 xxfield 的跨字段約束的相關(guān)標識可以查看官網(wǎng)的此處

這里是 valiator 能支持的所有類型,從字段內(nèi)容,網(wǎng)絡(luò)方面,字符串,數(shù)據(jù)結(jié)構(gòu),比較的字符,其他的標識

另外關(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)于其他標識的使用就不過多贅述了,使用方式都大同小異,咱們可以參考上述的 demo 即可

自定義約束

當然,如果認為官方提供的支持的標識還不能滿足我們的要求,那么我們也是可以自定義咱們的標識的,例如,咱們要定義的標識是 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 包中的特殊約束,格式約束,錯誤處理,范圍約束,字符串約束,以及自定義約束都簡單過了一下,這些東西不需要朗讀和背誦,只需要咱們知道有他,需要的時候,能夠找到,能夠迅速使用起來即可

當然,如果想研究他的實現(xiàn)原理的,可以好好看看 validator 源碼包以及官方文檔,還是非常有意思的

以上就是golang中validator包的使用教程的詳細內(nèi)容,更多關(guān)于golang validator包的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go?語言中運行?C程序?代碼?

    Go?語言中運行?C程序?代碼?

    這篇文章主要介紹了Go?語言中運行?C程序代碼,通過直接在?Go?代碼中寫入?C?程序運行,下面操作過程需要的小伙伴可以參考一下
    2022-03-03
  • Golang基于sync.Once實現(xiàn)單例的操作代碼

    Golang基于sync.Once實現(xiàn)單例的操作代碼

    這篇文章主要介紹了golang實現(xiàn)單例的操作代碼,本文介紹基于sync.Once的方式來實現(xiàn)單例,熟練掌握這種模式,并理解其底層原理,對大部分人來講已經(jīng)完全夠用了,需要的朋友可以參考下
    2022-10-10
  • 使用go求冪的幾種方法小結(jié)

    使用go求冪的幾種方法小結(jié)

    這篇文章主要介紹了使用go求冪的幾種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go每日一庫之dateparse處理時間

    Go每日一庫之dateparse處理時間

    不管什么時候,處理時間總是讓人頭疼的一件事情。今天要介紹的dateparse實現(xiàn)解析日期時間格式的字符串。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • go語言base64用法實例

    go語言base64用法實例

    這篇文章主要介紹了go語言base64用法,實例分析了Go語言base64編碼的實用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 詳解Golang中Context的原理和使用技巧

    詳解Golang中Context的原理和使用技巧

    Golang?的?Context?包,中文可以稱之為“上下文”,是用來在?goroutine?協(xié)程之間進行上下文信息傳遞的,這些上下文信息包括?kv?數(shù)據(jù)、取消信號、超時時間、截止時間等。本文主要介紹了Context的原理和使用技巧,希望對大家有所幫助
    2022-11-11
  • GO語言Context的作用及各種使用方法

    GO語言Context的作用及各種使用方法

    golang的Context包是專門用來處理多個goroutine之間與請求域的數(shù)據(jù)、取消信號、截止時間等相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于GO語言Context的作用及各種使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 深入探究Go語言的錯誤策略與異常機制

    深入探究Go語言的錯誤策略與異常機制

    本文深入探討了Go語言的錯誤策略與異常機制,主要介紹了錯誤處理的重要性,以及Go語言中的錯誤類型和處理函數(shù),此外還討論了Go語言的異常機制,包括panic和recover函數(shù)的使用,需要的朋友可以參考下
    2024-02-02
  • Golang中的Interface詳解

    Golang中的Interface詳解

    本文詳細講解了Golang中的Interface,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 淺析Go語言中的逃逸分析

    淺析Go語言中的逃逸分析

    逃逸分析算是go語言的特色之一,所以這篇文章小編就來和大家聊聊為什么不應(yīng)該過度關(guān)注go語言的逃逸分析,感興趣的小伙伴可以跟隨小編一起了解一下
    2024-10-10

最新評論

洮南市| 石河子市| 文水县| 杭锦后旗| 金乡县| 贵溪市| 深泽县| 轮台县| 荆州市| 张家川| 射洪县| 梧州市| 晋州市| 长沙县| 乐陵市| 岳阳市| 兴业县| 阜新| 沛县| 金沙县| 瑞金市| 汝南县| 武城县| 柘荣县| 深州市| 出国| 双鸭山市| 梅河口市| 永泰县| 广德县| 五常市| 新河县| 多伦县| 大荔县| 错那县| 青海省| 阳原县| 威海市| 廊坊市| 怀远县| 越西县|