目前大都是使用 validator
網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)公司專注網(wǎng)站定制,經(jīng)驗豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計體驗!已為邊坡防護網(wǎng)等企業(yè)提供專業(yè)服務(wù)。
安裝
go get gopkg.in/go-playground/validator.v9
原理
當(dāng)然只能通過反射來實現(xiàn)了,之前寫過一篇反射的文章 golang之反射和斷言 ,里面有寫到怎么通過反射獲取struct tag。
讀取struct tag之后就是對里面的標(biāo)識符進行識別,然后進行驗證了。具體可以去看源碼。
demo
簡單使用:
package main import ( "fmt" "gopkg.in/go-playground/validator.v9" ) // User contains user information type UserInfo struct { FirstName string `validate:"required"` LastName string `validate:"required"` Age uint8 `validate:"gte=0,lte=100"` Email string `validate:"required,email"` } func main() { validate := validator.New() user := &UserInfo{ FirstName: "Badger", LastName: "Smith", Age: 105, Email: "", } err := validate.Struct(user) if err != nil { for _, err := range err.(validator.ValidationErrors) { fmt.Println(err) } return } fmt.Println("success") }
輸出:
Key: 'UserInfo.Age' Error:Field validation for 'Age' failed on the 'lte' tag
Key: 'UserInfo.Email' Error:Field validation for 'Email' failed on the 'required' tag
其它類型可以參照文檔 https://godoc.org/gopkg.in/go-playground/validator.v9
幾個例子:
1.IP type UserInfo struct { Ip string `validate:"ip"` } 2.數(shù)字 type UserInfo struct { Number float32 `validate:"numeric"` } 3.最大值 type UserInfo struct { Number float32 `validate:"max=10"` } 4.最小值 type UserInfo struct { Number float32 `validate:"min=10"` }
自定義驗證函數(shù)
package main import ( "fmt" "gopkg.in/go-playground/validator.v9" "unicode/utf8" ) // User contains user information type UserInfo struct { Name string `validate:"checkName"` Number float32 `validate:"numeric"` } // 自定義驗證函數(shù) func checkName(fl validator.FieldLevel) bool { count := utf8.RuneCountInString(fl.Field().String()) fmt.Printf("length: %v \n", count) if count > 5 { return false } return true } func main() { validate := validator.New() //注冊自定義函數(shù),與struct tag關(guān)聯(lián)起來 err := validate.RegisterValidation("checkName", checkName) user := &UserInfo{ Name: "我是中國人,我愛自己的祖國", Number: 23, } err = validate.Struct(user) if err != nil { for _, err := range err.(validator.ValidationErrors) { fmt.Println(err) } return } fmt.Println("success") }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。