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