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

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

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

    Go語言多人聊天室項(xiàng)目實(shí)戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了Go語言多人聊天室項(xiàng)目實(shí)戰(zhàn),實(shí)現(xiàn)單撩或多撩等多種功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 如何使用Golang發(fā)送Get和Post請求

    如何使用Golang發(fā)送Get和Post請求

    這篇文章主要給大家介紹了關(guān)于如何使用Golang發(fā)送Get和Post請求的相關(guān)資料,Go語言(Golang)的標(biāo)準(zhǔn)庫提供了處理HTTP請求的功能,這使得將Go用于web應(yīng)用程序變得非常容易,需要的朋友可以參考下
    2023-06-06
  • 淺談Gin框架中bind的使用

    淺談Gin框架中bind的使用

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

    Go語言中的自定義類型你了解嗎

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

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

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

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

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

    golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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)過前面的幾節(jié)對pprof的介紹,對pprof統(tǒng)計(jì)的原理算是掌握了七八十了,但唯獨(dú)還沒有分析pprof?工具是如何統(tǒng)計(jì)cpu使用情況的,今天我們來分析下這部分
    2023-04-04
  • Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系解析

    Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系解析

    這篇文章主要為大家介紹了Go語言rune與字符串轉(zhuǎn)換的密切關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 淺談goland導(dǎo)入自定義包時出錯(一招解決問題)

    淺談goland導(dǎo)入自定義包時出錯(一招解決問題)

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

最新評論