最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2024年08月07日 09:47:29   作者:十三度灰  
在使用 Gin 框架的時(shí)候,前后端傳遞數(shù)據(jù)的時(shí)候,比如使用 JSON 格式,通常會(huì)使用 ShouldBindJSON 去用結(jié)構(gòu)體打 tag 綁定前端傳來的 JSON 格式數(shù)據(jù),本文給大家介紹了Go語言中validation庫不能校驗(yàn)零值問題的解決方法,需要的朋友可以參考下

問題描述

在用于綁定的結(jié)構(gòu)體中,通常會(huì)使用 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ù)錯(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)聽
     err := r.Run(":9090")
     if err != nil {
         panic(err.Error())
     }
 }

使用 Postman 去調(diào)試接口:

可以看到?jīng)]有問題,但是當(dāng) status 值為 0 的時(shí)候,參數(shù)校驗(yàn)就會(huì)不通過:

解決方法

原因是:Go 中會(huì)給結(jié)構(gòu)體中沒有賦值的字段賦予零值(int 類型默認(rèn) 0、string 類型默認(rèn) "",等等),標(biāo)簽寫成 require 時(shí),如果傳遞零值,validator 校驗(yàn)的時(shí)候就會(huì)認(rèn)為沒有傳遞這個(gè)字段,進(jìn)而報(bào)錯(cuò)

解決方法也很簡單,既然原因是因?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è)問題:

在綁定成功后,我們可能需要針對 user.Status 字段寫一些邏輯,比如 status 值為 1 時(shí)表示為正常狀態(tài),0 為非正常狀態(tài),那么簡單的示例為:

可以看到,user.Status == 0 這一段報(bào)錯(cuò)了,因?yàn)?user.Status 是指針類型,不能直接與 int 類型比較,要想比較只能加上地址符 * ,或者再使用一個(gè)變量接收由 *int 類型轉(zhuǎn)換來的 int 類型

總結(jié)

當(dāng)遇到 validator 庫無法校驗(yàn)零值時(shí),把數(shù)據(jù)類型換為對應(yīng)的指針類型即可正常接收,但是在后續(xù)邏輯中,不能直接用這個(gè)指針類型的值進(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)文章

  • golang接口實(shí)現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    golang接口實(shí)現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    這篇文章主要為大家介紹了golang接口實(shí)現(xiàn)調(diào)用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • GoFrame框架使用避坑指南和實(shí)踐干貨

    GoFrame框架使用避坑指南和實(shí)踐干貨

    這篇文章主要為大家介紹了GoFrame框架使用避坑指南和實(shí)踐干貨,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go如何優(yōu)雅的關(guān)閉goroutine協(xié)程

    Go如何優(yōu)雅的關(guān)閉goroutine協(xié)程

    本文將介紹首先為什么需要主動(dòng)關(guān)閉goroutine,并介紹如何在Go語言中關(guān)閉goroutine的常見套路,包括傳遞終止信號(hào)和協(xié)程內(nèi)部捕捉終止信號(hào),之后,文章列舉了需要主動(dòng)關(guān)閉協(xié)程運(yùn)行的常見場景,希望通過本文的介紹,讀者能夠掌握如何在適當(dāng)?shù)臅r(shí)候關(guān)閉goroutine
    2023-05-05
  • Go語言中Seeker接口的用法詳解

    Go語言中Seeker接口的用法詳解

    Go語言標(biāo)準(zhǔn)庫中的io包提供了一系列接口,用于處理各種I/O操作,其中Seeker接口在處理大文件或需要隨機(jī)訪問的場景中非常有用,本文將結(jié)合具體案例,詳細(xì)介紹Go語言中io包的Seeker接口的用法,需要的朋友可以參考下
    2024-10-10
  • golang的os包用法詳解

    golang的os包用法詳解

    Go語言的 os 包中提供了操作系統(tǒng)函數(shù)的接口,是一個(gè)比較重要的包。顧名思義,os 包的作用主要是在服務(wù)器上進(jìn)行系統(tǒng)的基本操作,本文將詳細(xì)介紹了golang的os包用法,需要的朋友可以參考下
    2023-05-05
  • Golang?channel為什么不會(huì)阻塞的原因詳解

    Golang?channel為什么不會(huì)阻塞的原因詳解

    這篇文章主要為大家介紹了Golang?channel為什么不會(huì)阻塞的原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 圖文詳解Go中的channel

    圖文詳解Go中的channel

    Channel是go語言內(nèi)置的一個(gè)非常重要的特性,也是go并發(fā)編程的兩大基石之一,下面這篇文章主要給大家介紹了關(guān)于Go中channel的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 一文掌握gorm簡介及如何使用gorm

    一文掌握gorm簡介及如何使用gorm

    Gorm是一款用于Golang的ORM框架,它提供了豐富的功能,包括模型定義、數(shù)據(jù)驗(yàn)證、關(guān)聯(lián)查詢等,下面通過本文掌握gorm簡介及使用方法,需要的朋友可以參考下
    2024-02-02
  • Go語言并發(fā)處理的使用詳解

    Go語言并發(fā)處理的使用詳解

    Go語言通過內(nèi)置的goroutine和channel機(jī)制,實(shí)現(xiàn)了高效的并發(fā)編程,本文就來介紹一下Go語言并發(fā)處理的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • golang flag介紹和使用示例

    golang flag介紹和使用示例

    本文主要介紹了Go語言中flag包的使用方法,詳細(xì)闡述了基本概念及常用函數(shù),并通過示例代碼進(jìn)行了具體演示,總結(jié)中指出,flag包提供了一種方便的方式來處理命令行參數(shù),可定義不同類型的標(biāo)志,并在解析后使用這些參數(shù)
    2024-10-10

最新評論

昆明市| 四平市| 光山县| 乌海市| 许昌市| 改则县| 称多县| 寿光市| 合山市| 景洪市| 瑞丽市| 资阳市| 安仁县| 舞阳县| 南丰县| 利津县| 衡阳市| 宁津县| 乐陵市| 双城市| 沿河| 南华县| 安塞县| 灵川县| 通山县| 兴化市| 平罗县| 年辖:市辖区| 商水县| 凤城市| 军事| 从江县| 凯里市| 乌兰察布市| 运城市| 景宁| 沁水县| 惠州市| 内丘县| 禹城市| 荔波县|