查看: 78|回复: 0

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

[复制链接]

3

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2012-4-9
发表于 2021-10-25 11:55:00 | 显示全部楼层 |阅读模式

解决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

(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,也可以通过校验

3、总结

go gin框架 binding:"required"`无法接收零值,只要把类型定义为指针类型即可接受零值

参考链接:https://blog.csdn.net/weixin_42279809/article/details/107800081



来源:https://www.cnblogs.com/rainbow-tan/p/15457818.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部