解決go gin框架 bindingrequired`無法接收零值的問題


解決go gin框架 binding:"required"`無法接收零值的問題

1、現象:

​ 在go中gin框架中,需要接收前端參數時,參數必填,我們一般添加binding:"required"`標簽,這樣前端參數不給時,gin框架會自動校驗,給出error。

​ gin的參數校驗是基於validator的,如果給了required標簽,則不能傳入零值,比如字符串的不能傳入空串,int類型的不能傳入0,bool類型的不能傳入false。

​ 有時候我們需要參數必填,而且需要可以傳入零值。比如性別sex有0和1表示,0表示女,1表示男,而且需要必填。這個時候,我們可以通過定義int類型的指針解決該問題。同理,其他類型也是定義指針即可。

2、參考例子

(1)不能接受零值的例子

package main

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
)

// Student
// 假設前端需要傳入參數name,age,sex
// name表示學生的姓名(必填)
// age表示學生的年齡(必填)
// sex表示學生的性別,0是女,1是男(必填)
type Student struct {
   Name string `json:"name" binding:"required"`
   Age  int    `json:"age" binding:"required"`
   Sex  int    `json:"sex" binding:"required"`
}

func main() {
   engine := gin.Default() //創建一個默認的引擎

   //請求 http://127.0.0.1:8090/student/add
   engine.POST("/student/add", func(context *gin.Context) {
      student := Student{}
      err := context.ShouldBind(&student)
      if err != nil {
         log.Printf("參數錯誤:%v", err)
         context.JSON(200, gin.H{"success": false, "msg": err.Error()})
         return
      }
      context.JSON(200, gin.H{"success": true, "msg": ""})
      return
   })

   err := engine.Run("0.0.0.0:8090") //啟動引擎,端口是8090
   if err != nil {
      panic(fmt.Sprintf("啟動引擎失敗,失敗信息:%s", err.Error()))
   }
}

前端傳入參數,性別為0,則報error

Key: 'Student.Sex' Error:Field validation for 'Sex' failed on the 'required' tag

image-20211025114610076

(2)可以接受零值的例子

只需要把

Sex  int    json:"sex" binding:"required"

變成

Sex  *int    json:"sex" binding:"required"

即可

package main

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
)

// Student
// 假設前端需要傳入參數name,age,sex
// name表示學生的姓名(必填)
// age表示學生的年齡(必填)
// sex表示學生的性別,0是女,1是男(必填)
type Student struct {
   Name string `json:"name" binding:"required"`
   Age  int    `json:"age" binding:"required"`
   Sex  *int    `json:"sex" binding:"required"`
}

func main() {
   engine := gin.Default() //創建一個默認的引擎

   //請求 http://127.0.0.1:8090/student/add
   engine.POST("/student/add", func(context *gin.Context) {
      student := Student{}
      err := context.ShouldBind(&student)
      if err != nil {
         log.Printf("參數錯誤:%v", err)
         context.JSON(200, gin.H{"success": false, "msg": err.Error()})
         return
      }
      context.JSON(200, gin.H{"success": true, "msg": ""})
      return
   })

   err := engine.Run("0.0.0.0:8090") //啟動引擎,端口是8090
   if err != nil {
      panic(fmt.Sprintf("啟動引擎失敗,失敗信息:%s", err.Error()))
   }
}

前端傳入參數,性別為0,也可以通過校驗

image-20211025115045101

3、總結

go gin框架 binding:"required"`無法接收零值,只要把類型定義為指針類型即可接受零值

參考鏈接:https://blog.csdn.net/weixin_42279809/article/details/107800081


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM