军瑶 發表於 2021-10-25 11:55:00

解决go gin框架 bindingrequired`无法接收零值的问题

<h2 id="解决go-gin框架-bindingrequired无法接收零值的问题">解决go gin框架 binding:"required"`无法接收零值的问题</h2>
<p>1、现象:</p>
<p>​        在go中gin框架中,需要接收前端参数时,参数必填,我们一般添加binding:"required"`标签,这样前端参数不给时,gin框架会自动校验,给出error。</p>
<p>​        gin的参数校验是基于validator的,如果给了required标签,则不能传入零值,比如字符串的不能传入空串,int类型的不能传入0,bool类型的不能传入false。</p>
<p>​        有时候我们需要参数必填,而且需要可以传入零值。比如性别sex有0和1表示,0表示女,1表示男,而且需要必填。这个时候,我们可以通过定义int类型的指针解决该问题。同理,其他类型也是定义指针即可。</p>
<p>2、参考例子</p>
<p>(1)不能接受零值的例子</p>
<pre><code class="language-go">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"`
   Ageint    `json:"age" binding:"required"`
   Sexint    `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(&amp;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()))
   }
}
</code></pre>
<p>前端传入参数,性别为0,则报error</p>
<p>Key: 'Student.Sex' Error:Field validation for 'Sex' failed on the 'required' tag</p>
<img src="https://img2020.cnblogs.com/blog/1768648/202110/1768648-20211025115415653-1904492321.png">
<p>(2)可以接受零值的例子</p>
<p>只需要把</p>
<pre><code>Sexint    json:"sex" binding:"required"
</code></pre>
<p>变成</p>
<pre><code>Sex*int    json:"sex" binding:"required"
</code></pre>
<p>即可</p>
<pre><code class="language-go">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"`
   Ageint    `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(&amp;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()))
   }
}
</code></pre>
<p>前端传入参数,性别为0,也可以通过校验</p>
<img src="https://img2020.cnblogs.com/blog/1768648/202110/1768648-20211025115416135-1319911466.png">
<p>3、总结</p>
<p>go gin框架 binding:"required"`无法接收零值,只要把类型定义为指针类型即可接受零值</p>
<p>参考链接:https://blog.csdn.net/weixin_42279809/article/details/107800081</p><br><br>
来源:https://www.cnblogs.com/rainbow-tan/p/15457818.html
頁: [1]
查看完整版本: 解决go gin框架 bindingrequired`无法接收零值的问题