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