示例如下,详细用法见 https://gin-gonic.com/zh-cn/docs/
test.go
package main
// ShouldBind学习,验证和绑定
import (
"github.com/gin-gonic/gin"
"time"
)
// 多个用,隔开,并列用|
type Boy struct{
Name string `form:"name" binding:"required"`
Age int `form:"age" binding:"required,gt=0"`
Address string `form:"address"`
Brithday time.Time `form:"brithday" time_format:"2006-01-02"`
}
func handleBoy(c *gin.Context) {
var boy Boy
if err := c.ShouldBind(&boy); err == nil {
//c.String(200, "%v", boy)
c.JSON(200, gin.H{
"name": boy.Name,
"age": boy.Age,
"address": boy.Address,
"brithday": boy.Brithday,
})
} else {
c.JSON( 200, gin.H{
"error": err.Error(),
})
//c.String(200, "%v", err)
}
}
func main(){
r := gin.Default()
r.POST("/boy", handleBoy)
r.Run(":2017")
}
测试发现
为什么age传入0值,required校验不过呢
因为go中int默认值为0,int没有null值。可以简单的理解int的0和null等价。
番外篇,java中有int和Interger两种表示整形,int是整形的基本类型,默认值为0,Interger是整形的包装类,默认值为null。、
那么,Go对http接口入参为0值的如何正确校验呢
将age类型换成*int
修改后的代码如下
test.go
package main
// ShouldBind学习,验证和绑定
import (
"github.com/gin-gonic/gin"
"time"
)
// 多个用,隔开,并列用|
type Boy struct{
Name string `form:"name" binding:"required"`
Age *int `form:"age" `
Address string `form:"address"`
Brithday time.Time `form:"brithday" time_format:"2006-01-02"`
}
func handleBoy(c *gin.Context) {
var boy Boy
if err := c.ShouldBind(&boy); err == nil {
//c.String(200, "%v", boy)
c.JSON(200, gin.H{
"name": boy.Name,
"age": boy.Age,
"address": boy.Address,
"brithday": boy.Brithday,
})
} else {
c.JSON( 200, gin.H{
"error": err.Error(),
})
//c.String(200, "%v", err)
}
}
func main(){
r := gin.Default()
r.POST("/boy", handleBoy)
r.Run(":2017")
}
测试结果