首页 > 其他分享 >解决go gin框架 binding:"required"`无法接收零值的问题

解决go gin框架 binding:"required"`无法接收零值的问题

时间:2023-04-23 20:58:08浏览次数:55  
标签:err 必填 required binding sex go gin

 

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

  分类: Go

标签:err,必填,required,binding,sex,go,gin
From: https://www.cnblogs.com/cheyunhua/p/17347692.html

相关文章

  • Django(二)
    Django(二)配置文件的介绍SECRET_KEY='django-insecure-l90y*hw_4v_&tgpwi$js+7)899ltdn=$=3$c!yct!f*mc6u#0j'#盐DEBUG=True#不想显示错误就改成False,上线的时候在改成False#配置数据库DATABASES={'default':{'ENGINE':'djang......
  • Django(三)
    Django(三)ORM的增删改查模板变量的分配"""第一种方式"""defab_render(request):#模板语法,写在views中user_dict={'username':'lisi','password':123}returnrender(request,'ab_render.html',{'......
  • mysql主从:mysql 主从、django使用多数据库做读写分离
    目录一、mysql主从介绍搭建步骤二、django使用多数据库做读写分离一、mysql主从介绍MySQL主从复制是一种常见的数据库复制技术,可以将一个MySQL数据库的数据复制到多个从库中,从而提高读取性能和数据可用性。在主从复制中,主库是数据的源头,从库是数据的副本,主库将数据变更记录......
  • Django4全栈进阶之路5 对各类数据库连接设置
    Django4支持多种类型的数据库连接,包括MySQL、PostgreSQL、SQLite、Oracle等。对于不同类型的数据库,需要进行不同的设置。下面是Django4对各类数据库连接的设置方法。MySQL在Django4中连接MySQL数据库,需要使用django.db.backends.mysql引擎。在settings.py文件中......
  • Django笔记二十九之中间件介绍
    本文首发于公众号:Hunter后端原文链接:Django笔记二十九之中间件介绍这一节介绍一下Django的中间件。关于中间件,官方文档的解释为:中间件是一个嵌入Django系统的request和response的钩子框架,是一个能够全局改变Django输入/输出的系统。我们可以这样理解,一个request......
  • Google Chrome安装Mathjax插件在Github渲染LaTex公式
    打开chrome应用商店,搜索MathJax3PluginforGithub,安装插件,在阅读Github上的Markdown文件时会自动渲染LaTex公式。渲染前:渲染后:图片来源在Edge上没有找到在Github渲染LaTex公式的插件qwq......
  • Django4全栈进阶之路3 Model模型
    在Django中,模型(Model)是用于定义数据结构的组件,其作用如下:定义数据结构:模型用于定义数据库中的表格和表格中的字段(列),其中每个模型类对应一个表格,模型中的每个字段对应表格中的一列。模型的定义可以在 models.py 文件中完成。数据库操作:模型提供了简单易用的API用于操作......
  • 在Go中map[]bool与map[]struct{}性能对比
    在Go中,map[]struct{}在性能和内存消耗方面比map[]bool更好,时间上快了5%,内存消耗少了10%,尤其是在处理大型集合时。众所周知,Go语言没有内置Set,因此开发人员使用map来模仿Set的行为。使用map来实现Set意味着map的值不重要,我们只需要关注键的存在。大多数情况下,人们可能会选择bool,因为......
  • django生命周期和路由层
    django生命周期https://www.yuque.com/liyangqit/cbndkh/evyps8django路由层1.路由匹配 django2.X及以上path第一个参数写什么就匹配什么 django1.X第一个参数是正则表达式 无论什么版本django都自带加斜杠后缀的功能也可以取消 配置文件中APPEND_SLASH=False#默......
  • Go--连接redis
    直接看代码packagemainimport("errors""fmt""github.com/go-redis/redis""time")//先下载三方依赖包,以下两个都可以,这里使用的是第一个//goget-ugithub.com/go-redis/redis//goget-ugithub.com/garyburd/redigo/redisfun......