Go語(yǔ)言中validation庫(kù)不能校驗(yàn)零值問(wèn)題的解決方法
問(wèn)題描述
在用于綁定的結(jié)構(gòu)體中,通常會(huì)使用 validator
庫(kù)進(jìn)行參數(shù)的校驗(yàn),比如:
type User struct { Name string `json:"name" binding:"required" example:"kkk"` Age int `json:"age" binding:"required" example:"18"` Status int `json:"status" binding:"required" example:"1"` }
我們規(guī)定前端傳遞的參數(shù)中,user、age、status 參數(shù)都為必填
然后在 Handler
函數(shù)中使用 ShouldBindJSON
綁定參數(shù),如下:
func handlerT(c *gin.Context) { var user User if err := c.ShouldBindJSON(&user); err != nil { fmt.Println(err) c.JSON(400, gin.H{"msg": "參數(shù)錯(cuò)誤" + err.Error()}) return } }
完整代碼如下:
package main ? import ( "fmt" "github.com/gin-gonic/gin" ) ? type User struct { Name string `json:"name" binding:"required" example:"kkk"` Age int `json:"age" binding:"required" example:"18"` Status int `json:"status" binding:"required" example:"1"` } ? func handlerT(c *gin.Context) { var user User if err := c.ShouldBindJSON(&user); err != nil { fmt.Println(err) c.JSON(400, gin.H{"msg": "參數(shù)錯(cuò)誤" + err.Error()}) return } c.JSON(200, gin.H{"msg": "ok", "data": user}) } ? func main() { r := gin.Default() r.POST("/user", handlerT) ? // 監(jiān)聽(tīng) err := r.Run(":9090") if err != nil { panic(err.Error()) } }
使用 Postman 去調(diào)試接口:
可以看到?jīng)]有問(wèn)題,但是當(dāng) status 值為 0 的時(shí)候,參數(shù)校驗(yàn)就會(huì)不通過(guò):
解決方法
原因是:Go 中會(huì)給結(jié)構(gòu)體中沒(méi)有賦值的字段賦予零值(int 類型默認(rèn) 0、string 類型默認(rèn) "",等等),標(biāo)簽寫成 require
時(shí),如果傳遞零值,validator
校驗(yàn)的時(shí)候就會(huì)認(rèn)為沒(méi)有傳遞這個(gè)字段,進(jìn)而報(bào)錯(cuò)
解決方法也很簡(jiǎn)單,既然原因是因?yàn)樽侄蔚念愋土阒凳?0,那選用默認(rèn)值不是 0 的數(shù)據(jù)類型,而且也要是數(shù)值類型
所以,解決方法就是:把 int
類型改為 *int
類型,使用 int 的指針類型,零值為 nil,這樣傳遞的時(shí)候就能成功綁定
結(jié)構(gòu)體改為:
type User struct { Name string `json:"name" binding:"required" example:"kkk"` Age int `json:"age" binding:"required" example:"18"` Status *int `json:"status" binding:"required" example:"1"` }
再使用 Postman 調(diào)試:
可以看到成功綁定,但是這樣會(huì)有一個(gè)問(wèn)題:
在綁定成功后,我們可能需要針對(duì) user.Status 字段寫一些邏輯,比如 status 值為 1 時(shí)表示為正常狀態(tài),0 為非正常狀態(tài),那么簡(jiǎn)單的示例為:
可以看到,user.Status == 0
這一段報(bào)錯(cuò)了,因?yàn)?user.Status
是指針類型,不能直接與 int 類型比較,要想比較只能加上地址符 *
,或者再使用一個(gè)變量接收由 *int
類型轉(zhuǎn)換來(lái)的 int
類型
總結(jié)
當(dāng)遇到 validator
庫(kù)無(wú)法校驗(yàn)零值時(shí),把數(shù)據(jù)類型換為對(duì)應(yīng)的指針類型即可正常接收,但是在后續(xù)邏輯中,不能直接用這個(gè)指針類型的值進(jìn)行常規(guī)運(yùn)算,要么加上地址符 *
要么用中間變量接收轉(zhuǎn)換后的值
以上就是Go語(yǔ)言中validation庫(kù)不能校驗(yàn)零值問(wèn)題的解決方法的詳細(xì)內(nèi)容,更多關(guān)于Go validation不能校驗(yàn)零值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn),實(shí)現(xiàn)單撩或多撩等多種功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08如何使用Golang發(fā)送Get和Post請(qǐng)求
這篇文章主要給大家介紹了關(guān)于如何使用Golang發(fā)送Get和Post請(qǐng)求的相關(guān)資料,Go語(yǔ)言(Golang)的標(biāo)準(zhǔn)庫(kù)提供了處理HTTP請(qǐng)求的功能,這使得將Go用于web應(yīng)用程序變得非常容易,需要的朋友可以參考下2023-06-06深入理解Golang中的dig包管理和解決依賴關(guān)系
這篇文章主要為大家詳細(xì)介紹了golang中dig包的使用方法,探討其應(yīng)用場(chǎng)景,并提供一些示例,展示如何結(jié)合其他庫(kù)來(lái)更好地實(shí)現(xiàn)這些場(chǎng)景,感興趣的小伙伴可以了解下2024-01-01GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室
今天小編給大家分享一個(gè)簡(jiǎn)單的聊天室功能,聊天室主要功能是用戶可以加入離開(kāi)聊天室,實(shí)現(xiàn)思路也很簡(jiǎn)單明了,下面小編給大家?guī)?lái)了完整代碼,感興趣的朋友跟隨小編一起看看吧2021-12-12golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Golang?pprof監(jiān)控之cpu占用率統(tǒng)計(jì)原理詳解
經(jīng)過(guò)前面的幾節(jié)對(duì)pprof的介紹,對(duì)pprof統(tǒng)計(jì)的原理算是掌握了七八十了,但唯獨(dú)還沒(méi)有分析pprof?工具是如何統(tǒng)計(jì)cpu使用情況的,今天我們來(lái)分析下這部分2023-04-04Go語(yǔ)言rune與字符串轉(zhuǎn)換的密切關(guān)系解析
這篇文章主要為大家介紹了Go語(yǔ)言rune與字符串轉(zhuǎn)換的密切關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12淺談goland導(dǎo)入自定義包時(shí)出錯(cuò)(一招解決問(wèn)題)
這篇文章主要介紹了淺談goland導(dǎo)入自定義包時(shí)出錯(cuò)(一招解決問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12