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

(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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏