Golang 語言的值驗證庫 Validator 怎麼使用?

2021-03-02 Golang語言開發棧

01

介紹

Validator 是基於 tag(標記)實現結構體和單個欄位的值驗證庫,它包含以下功能:

使用驗證 tag(標記)或自定義驗證器進行跨欄位和跨結構體驗證。

關於 slice、數組和 map,允許驗證多維欄位的任何或所有級別。

能夠深入 map 鍵和值進行驗證。

通過在驗證之前確定接口的基礎類型來處理類型接口。

處理自定義欄位類型(如 sql 驅動程序 Valuer)。

別名驗證標記,它允許將多個驗證映射到單個標記,以便更輕鬆地定義結構體上的驗證。

提取自定義的欄位名稱,例如,可以指定在驗證時提取 JSON 名稱,並在生成的 FieldError 中使用該名稱。

可自定義 i18n 錯誤消息。

Web 框架 gin 的默認驗證器。

安裝:

使用 go get:

go get github.com/go-playground/validator/v10

然後將 Validator 包導入到代碼中:

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

02

變量驗證

Var 方法使用 tag(標記)驗證方式驗證單個變量。

func (*validator.Validate).Var(field interface{}, tag string) error

它接收一個  interface{} 空接口類型的 field 和一個 string 類型的 tag,返回傳遞的非法值得無效驗證錯誤,否則將 nil 或 ValidationErrors 作為錯誤。如果錯誤不是 nil,則需要斷言錯誤去訪問錯誤數組,例如:

validationErrors := err.(validator.ValidationErrors)

如果是驗證數組、slice 和 map,可能會包含多個錯誤。

示例代碼:

func main() {  validate := validator.New()    email := "admin#admin.com"  email := ""  err := validate.Var(email, "required,email")  if err != nil {    validationErrors := err.(validator.ValidationErrors)    fmt.Println(validationErrors)            return  }}

03

結構體驗證

結構體驗證結構體公開的欄位,並自動驗證嵌套結構體,除非另有說明。

func (*validator.Validate).Struct(s interface{}) error

它接收一個  interface{} 空接口類型的 s,返回傳遞的非法值得無效驗證錯誤,否則將 nil 或 ValidationErrors 作為錯誤。如果錯誤不是 nil,則需要斷言錯誤去訪問錯誤數組,例如:

validationErrors := err.(validator.ValidationErrors)

實際上,Struct 方法是調用的 StructCtx 方法,因為本文不是源碼講解,所以此處不展開贅述,如有興趣,可以查看源碼。

示例代碼:

func main() {  validate = validator.New()  type User struct {    ID     int64  `json:"id" validate:"gt=0"`    Name   string `json:"name" validate:"required"`    Gender string `json:"gender" validate:"required,oneof=man woman"`    Age    uint8  `json:"age" validate:"required,gte=0,lte=130"`    Email  string `json:"email" validate:"required,email"`  }  user := &User{    ID:     1,    Name:   "frank",    Gender: "boy",    Age:    180,    Email:  "gopher@88.com",  }  err = validate.Struct(user)  if err != nil {    validationErrors := err.(validator.ValidationErrors)            fmt.Println(validationErrors.Translate(trans))    return  }}

細心的讀者可能已經發現,錯誤輸出信息並不友好,錯誤輸出信息中的欄位不僅沒有使用備用名(首字母小寫的欄位名),也沒有翻譯為中文。通過改動代碼,使錯誤輸出信息變得友好。

註冊一個函數,獲取結構體欄位的備用名稱:

validate.RegisterTagNameFunc(func(fld reflect.StructField) string {    name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]    if name == "-" {      return "j"    }    return name  })

錯誤信息翻譯為中文:

zh := zh.New()uni = ut.New(zh)trans, _ := uni.GetTranslator("zh")_ = zh_translations.RegisterDefaultTranslations(validate, trans)

04

標籤

通過以上章節的內容,讀者應該已經了解到 Validator 是一個基於 tag(標籤),實現結構體和單個欄位的值驗證庫。

本章節列舉一些比較常用的標籤:

標籤描述eq
等於
gt
大於
gte
大於等於
lt
小於
lte
小於等於
ne
不等於
max最大值min最小值oneof
其中一個
required
必需的
unique唯一的
isDefault
默認值len長度
email郵箱格式

05

總結

本文簡單介紹了在 Go 語言中比較流行的值驗證庫 Validator,通過簡單示例介紹了 validator 的一般用法,並列舉了一些常用的 tag。Validator 的功能非常強大,限於篇幅,無法一一介紹。如果讀者感興趣,想更加深入了解 validator,請參考 validator 的 Github 倉庫中的相關介紹,文末給出了連結地址。

關注微信公眾號,發送關鍵字「資料」,免費獲取 Go 語言學習資料。

參考資料:

https://github.com/go-playground/validator

相關焦點

  • Go 語言 Web 框架 Echo 系列:定製篇2 — 自定義 Validator,進行輸入校驗
    在 Awesome-Go 上可以找到第三方數據校驗庫:https://github.com/avelino/awesome-go#validation。本文我們使用最流行的 https://github.com/go-playground/validator 庫來講解。
  • Golang語言標準庫 sync 包的 Once 怎麼使用?
    02基本用法Once 的使用也非常簡單,Once 只有一個 Do 方法,接收一個無參數無返回值的函數類型的參數 f,不管調用多少次 Do 方法,參數 f 只在第一次調用 Do 方法時執行。代碼示例:05總結本文開篇介紹了 Once 的官方定義和使用場景,然後結合示例代碼,介紹了 Once 的基本使用,並通過閱讀源碼,介紹了 Once 的實現原理,最後列舉了一個容易踩的「坑」。
  • Golang 語言標準庫 bytes 包怎麼使用?
    注意:如果 sep 是一個空切片,返回值是 s 切片長度加 1。func HasPrefix(s, prefix []byte) bool HasPrefix 函數用於判斷字節切片 s 是否以 prefix 開頭,返回值是一個 bool 類型。
  • gin框架中使用validator若干實用技巧
    gin框架使用github.com/go-playground/validator進行參數校驗,目前已經支持github.com/go-playground/validator/v10了,我們需要在定義結構體時使用 binding tag標識相關校驗規則,可以查看validator文檔查看支持的所有 tag。
  • 15個最佳的 JavaScript 表單驗證庫
    這允許您處理您想要的驗證。approvejs暴露一個單一的方法,value()讓你決定當一個值驗證錯誤顯示的方式。如果你喜歡控制或有點強迫症一樣,approvejs是給你的。2.Validator.jsvalidator.js是一個字符串驗證器和殺菌劑庫。它可以在客戶端和伺服器端使用。
  • 「語言實踐」Go語言文檔自動化之go-swagger
    package結構go-swagger中在golang.org的包如下(這個可以到倉庫github下的golang庫可以找到)。,以及維護,和自動化還有服務化而服務,用來描述API格式(通過一個而配置文件格式)或者API定義的語言。
  • Golang語言情懷-第49期 Go 語言標準庫翻譯 compress/lzw
    調用者有責任在結束讀取後調用返回值的Close方法;litWidth指定字面碼的位數,必須在[2,8]範圍內,一般為8。func NewWriterfunc NewWriter(w io.Writer, order Order, litWidth int) io.WriteCloser創建一個io.WriteCloser,它將數據壓縮後寫入w。
  • golang之context使用
    背景golang中並發編程的三種實現方式:chan管道、waitGroup和Context。本篇將重點介紹context的使用,告訴大家基本的使用方式,做到會用。Context概念介紹context譯為上下文,golang在1.6.2的時候還沒有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的庫中。golang 的 Context包,是專門用來處理多個goroutine之間與請求域的數據、取消信號、截止時間等相關操作。
  • Go語言(Golang)環境搭建詳解
    我們在系統變量裡點擊新建,變量名輸入GOROOT,變量值是我們剛剛安裝的go路徑c:\Go,這樣就配置好了GO目錄的安裝路徑了。然後修改PATH系統變量,在變量值裡添加%%GOROOT\bin路徑,和其他PATH變量以;(分號,Linux下是冒號)分割即可。這樣我們就可以在CMD裡直接輸入go命令使用了。
  • Golang入門教程——基本操作篇
    func add(x, y int) int {    return x + y}多值返回在前面介紹golang特性的時候曾經提到過,golang作為一個看起來很守舊的語言,但是卻支持很多新鮮的特性。其中最知名的一個特性就是函數支持多值返回,即使是現在,也只有少量的語言支持這一特性。在許多語言當中,如果需要返回多個值,往往需要用一個結構體或者是tuple、list等數據結構將它們包裝起來。但是在golang當中支持同時返回多個結果,這將會極大地方便我們的編碼。
  • Golang指南:頂級Golang框架、IDE和工具列表
    (點擊尾部閱讀原文前往)原文:https://dzone.com/articles/golang-guide-a-list-of-top-golang-frameworks-ides自推出以來,Google的Go程式語言(Golang)越來越受主流用戶的歡迎。
  • Golang入門教程——面向對象篇
    今天是golang專題的第9篇文章,我們一起來看看golang當中的面向對象的部分。在現在高級語言當中,面向對象幾乎是不可或缺也是一門語言最重要的部分之一。golang作為一門剛剛誕生十年的新興語言自然是支持面向對象的,但是golang當中面向對象的概念和特性與我們之前熟悉的大部分語言都不盡相同。比如Java、Python等,相比之下, golang這個部分的設計非常得簡潔和優雅(仁者見仁),所以即使你之前沒有系統地了解過面向對象,也沒有關係,也一定能夠看懂。
  • Golang語言情懷-第46期 Go 語言標準庫翻譯 compress/bzip2
    若要覆蓋,請使用此參數。     -h或--help  顯示幫助。     -k或--keep  bzip2在壓縮或解壓縮後,會刪除原始的文件。若要保留原始文件,請使用此參數。     -s或--small  降低程序執行時內存的使用量。     -t或--test  測試.bz2壓縮文件的完整性。
  • Golang入門教程——map篇
    今天是golang專題的第7篇文章,我們來聊聊golang當中map的用法。map這個數據結構我們經常使用,存儲的是key-value的鍵值對。在C++/java當中叫做map,在Python中叫做dict。
  • gRPC 實操指南(golang)
    1.2 RPC業務場景RPC的應用場景很廣泛:•所有的分布式機都需要進行登陸的驗證,對於所有的主機都實現相同的登陸驗證邏輯維護極差,同時也失去部分分布式意義,所以從解耦的角度考慮,我們需要定義一個統一的登陸驗證業務來做。
  • golang中Context的使用場景
    golang中Context的使用場景context在Go1.7之後就進入標準庫中了。它主要的用處如果用一句話來說,是在於控制goroutine的生命周期。當一個計算任務被goroutine承接了之後,由於某種原因(超時,或者強制退出)我們希望中止這個goroutine的計算任務,那麼就用得到這個Context了。
  • Hibernate Validator 4.3.0.Final 發布
    用Annotations 給類或者類的屬性加上約束(constraint),在運行期檢查屬性值是很優雅的.Hibernate Validator就是這樣的一個框架.該框架是十分容易的(就像參考文檔中宣稱的那樣),幾乎沒有什麼學習曲線,Validator 是一個驗證框架
  • golang函數func介紹
    golang函數func介紹函數是基本的代碼塊,用於執行一個任務。Go 語言最少有個 main() 函數。
  • 【Go語言繪圖】gg 庫的基本使用
    經過一番查找,找到了一個Go語言圖片處理的庫,經過調研發現還挺強的,能滿足需求,於是決定寫點文章,記錄一下使用心得,以便日後不時之需。gg 庫的安裝和簡單使用 使用之前,我們當然得先來安裝一下這個庫:go get -u github.com/fogleman/gg這個庫的一個好處是有很多測試代碼,可以拿來跑跑看,就知道它大概能實現什麼樣的效果了
  • Golang錯誤處理:從咬牙切齒到欣然接受
    Golang語言有很多優點,顯式類型定義、靜態編譯打包、高性能的並發,協程和通道。但是也有一些令人詬病的地方,其中Golang錯誤處理,"五行代碼,三行錯誤處理"。那麼怎么正確的處理和對待Golang錯誤處理機制呢?