golang之?dāng)?shù)據(jù)校驗(yàn)的實(shí)現(xiàn)代碼示例
目前大都是使用 validator
安裝
go get gopkg.in/go-playground/validator.v9
原理
當(dāng)然只能通過(guò)反射來(lái)實(shí)現(xiàn)了,之前寫(xiě)過(guò)一篇反射的文章 golang之反射和斷言 ,里面有寫(xiě)到怎么通過(guò)反射獲取struct tag。
讀取struct tag之后就是對(duì)里面的標(biāo)識(shí)符進(jìn)行識(shí)別,然后進(jìn)行驗(yàn)證了。具體可以去看源碼。
demo
簡(jiǎn)單使用:
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
幾個(gè)例子:
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"` }
自定義驗(yàn)證函數(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"` } // 自定義驗(yàn)證函數(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() //注冊(cè)自定義函數(shù),與struct tag關(guān)聯(lián)起來(lái) err := validate.RegisterValidation("checkName", checkName) user := &UserInfo{ Name: "我是中國(guó)人,我愛(ài)自己的祖國(guó)", Number: 23, } err = validate.Struct(user) if err != nil { for _, err := range err.(validator.ValidationErrors) { fmt.Println(err) } return } fmt.Println("success") }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用golang如何優(yōu)雅的關(guān)機(jī)或重啟操作示例
這篇文章主要為大家介紹了使用golang如何優(yōu)雅的關(guān)機(jī)或重啟操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04GO將mysql?中?decimal?數(shù)據(jù)類型映射到?protobuf的操作方法
這篇文章主要介紹了go如何優(yōu)雅地將?mysql?中?decimal?數(shù)據(jù)類型映射到?protobuf,本文主要展示一下在 protobuf中 float與double的一個(gè)區(qū)別,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09最新版Golang?pprof使用詳解(引入、抓取、分析,圖文結(jié)合)
這篇文章主要介紹了最新版Golang?pprof使用詳解包括引入、抓取、分析,圖文結(jié)合,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-08-08Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄
這篇文章主要給大家介紹了關(guān)于Golang操作MySql數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11詳解Golang中文件系統(tǒng)事件監(jiān)聽(tīng)
文件系統(tǒng)事件是指文件系統(tǒng)相關(guān)的各種操作和狀態(tài)變化,當(dāng)一個(gè)應(yīng)用層的進(jìn)程操作文件或目錄時(shí),會(huì)觸發(fā)system call,內(nèi)核的notification子系統(tǒng)可以守在那里,把該進(jìn)程對(duì)文件的操作上報(bào)給應(yīng)用層的監(jiān)聽(tīng)進(jìn)程,這篇文章主要介紹了Golang之文件系統(tǒng)事件監(jiān)聽(tīng),需要的朋友可以參考下2024-01-01