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