使用 Govalidator 驗證 Go 結構
結構體是 Go 編程語言中提供的主要且廣泛使用的數據類型之一。許多跨各種功能的包,從數據庫包到 ORM,一些 Web 框架使用結構來輕鬆進行數據解析和其他操作。
結構驗證是 Go 中的一項常見任務,Go 驗證程序包提供了一種簡單有效的方法來驗證項目中的結構。
什麼是 Go Validator 包
Go 驗證程序包根據結構聲明上的指定標記為結構和各個字段實現值驗證。
Go validator 包提供了使用標籤、切片、數組和映射潛水進行跨字段和跨結構驗證的功能,這些功能允許多維字段驗證、自定義字段驗證、自定義字段名稱的提取、可自定義的錯誤消息以及支持流行的 Gin 框架作為包的默認驗證器。
在您的工作目錄的終端中運行這些命令之一以安裝驗證程序包。
go get gopkg.in/go-playground/validator.v9
go get github.com/go-playground/validator/v10
版本是 URL 的後綴。第一個命令安裝版本 9,第二個命令安裝包的版本 10。
安裝包後,您可以根據安裝的版本將包導入到您的項目中。
import (
"gopkg.in/go-playground/validator.v9"
)
您現在可以繼續使用 Go 驗證程序包。如果您的安裝有任何問題,請嘗試重新安裝/升級到最新的 Go 版本。
使用 Validator 包驗證結構
您需要創建validator.Validate結構的實例,使用驗證標記定義要驗證的結構以指定字段的驗證規則。
下面介紹瞭如何創建validator.Validate結構的實例。
func main() {
validate: = validator.New()
}
您可以通過為字段指定標籤來定義要驗證的結構,從而設置驗證規則。驗證標籤是指定規則的結構字段定義的特殊註釋。
這是用於驗證的常規結構。
type User struct {
Name string
Age int
Email string
}
這是結構的示例,已準備好進行驗證。
type User struct {
Name string `validate:"required"`
Age int `validate:"gte=0,lte=130"`
Email string `validate:"required,email"`
}
在此示例中,您指定了實例化時需要的Name字段, Age字段必須大於或等於 0 且小於或等於 130,並且Email字段是必需的並且必須是實例化時的有效電子郵件地址。
Go 驗證器包中提供了不同的驗證標籤,包括必填字段、最小值和最大值以及正則表達式的標籤。您可以在 Go 驗證程序包的文檔中找到可用驗證標籤的完整列表。
一旦定義了要驗證的結構並為每個字段指定了驗證規則,就可以使用validator.Validate結構的Struct方法來驗證結構。
user: = User{
// Name not instantiated
Age: 3990000,
Email: "john@example.com",
}
// note that the Name and Age fields fail the validation
err: = validate.Struct(user)
if err! = nil {
// Struct is invalid
}
如果存在驗證錯誤,Struct方法將返回錯誤,您可以根據自己的操作處理錯誤。
您可以使用錯誤的ValidationErrors方法訪問這些錯誤。
if err! = nil {
for _, err: = range err.(validator.ValidationErrors) {
fmt.Println(err.Field(), err.Tag())
}
}
ValidationErrors方法將返回帶有驗證錯誤的每個字段的名稱以及導致錯誤的驗證標記。
定義自定義驗證標籤
如果特定驗證要求不是內置標記的一部分,您還可以定義自定義驗證標記。
您可以使用validator.Validate結構的RegisterValidation方法。RegisterValidation方法有兩個參數;驗證標籤的名稱和驗證函數。驗證函數是一個回調函數,它會為每個具有自定義驗證標記的字段調用,如果字段有效則該函數必須返回true ,否則返回false。
下面是自定義驗證標記的示例定義。該標記驗證偶數字段。
validate.RegisterValidation("even", func(fl validator.FieldLevel) bool {
// Try to get the field value as an int
value, ok: = fl.Field().Interface().(int)
if! ok {
// If the field value is not an int, return false
return false
}
// Return true if the value is even, false, otherwise
return value % 2 == 0
})
該代碼甚至使用validator.Validate結構的RegisterValidation方法定義了自定義驗證標記。您使用一個函數定義了驗證標記,該函數採用類型為validator.FieldLevel的單個參數。
您現在可以像使用內置驗證標籤一樣在結構定義中使用自定義驗證標籤。
type MyStruct struct {
Value int `validate:"even"`
}
還有更多去結構
結構是 Go 中的一等公民,您可以使用結構做很多事情。如果您熟悉純面向對象的語言,則可以像使用類一樣使用 Go 結構來操作數據。
發佈留言