欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言中validation庫(kù)不能校驗(yàn)零值問(wèn)題的解決方法

 更新時(shí)間:2024年08月07日 09:47:29   作者:十三度灰  
在使用 Gin 框架的時(shí)候,前后端傳遞數(shù)據(jù)的時(shí)候,比如使用 JSON 格式,通常會(huì)使用 ShouldBindJSON 去用結(jié)構(gòu)體打 tag 綁定前端傳來(lái)的 JSON 格式數(shù)據(jù),本文給大家介紹了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)

    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)求

    如何使用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
  • 淺談Gin框架中bind的使用

    淺談Gin框架中bind的使用

    Gin框架中有bind函數(shù),可以非常方便的將url的查詢參數(shù)query?parameter、http的Header,body中提交上來(lái)的數(shù)據(jù)格式,本文就詳細(xì)的介紹Gin框架中bind的使用,感興趣的可以了解一下
    2021-12-12
  • Go語(yǔ)言中的自定義類型你了解嗎

    Go語(yǔ)言中的自定義類型你了解嗎

    自定義類型是 Go 語(yǔ)言中非常重要的概念之一,通過(guò)自定義類型,我們可以更好地封裝數(shù)據(jù)、組織代碼,提高程序的可讀性和可維護(hù)性。本文將從以下幾個(gè)方面介紹 Go 自定義類型的相關(guān)知識(shí),感興趣的可以了解一下
    2023-04-04
  • 深入理解Golang中的dig包管理和解決依賴關(guān)系

    深入理解Golang中的dig包管理和解決依賴關(guān)系

    這篇文章主要為大家詳細(xì)介紹了golang中dig包的使用方法,探討其應(yīng)用場(chǎng)景,并提供一些示例,展示如何結(jié)合其他庫(kù)來(lái)更好地實(shí)現(xiàn)這些場(chǎng)景,感興趣的小伙伴可以了解下
    2024-01-01
  • GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    今天小編給大家分享一個(gè)簡(jiǎn)單的聊天室功能,聊天室主要功能是用戶可以加入離開(kāi)聊天室,實(shí)現(xiàn)思路也很簡(jiǎn)單明了,下面小編給大家?guī)?lái)了完整代碼,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼

    golang 生成二維碼海報(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-02
  • Golang?pprof監(jiān)控之cpu占用率統(tǒng)計(jì)原理詳解

    Golang?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-04
  • Go語(yǔ)言rune與字符串轉(zhuǎn)換的密切關(guān)系解析

    Go語(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)題)

    這篇文章主要介紹了淺談goland導(dǎo)入自定義包時(shí)出錯(cuò)(一招解決問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論