结构体验证
使用gin框架的数据校验,可以不用解析数据,简少代码量。
package mainimport ("fmt""time""github.com/gin-gonic/gin")type Person struct {Age int `form:"age" binding:"required,gt=10"`Name string `form:"name" binding:"required"`Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc}func main() {r := gin.Default()r.GET("/text", func(c *gin.Context) {var person Personif err := c.ShouldBind(&persion); err != nil {c.String(500, fmt.Sprint(err))return}c.String(200, fmt.Sprint("%#", person))})r.Run()}
自定义校验
package mainimport ("net/http""reflect""github.com/gin-gonic/gin""github.com/gin-gonic/gin/binding""gopkg.in/go-playground/validator.v8")type Person struct {Age int `form:"age" binding:"required,gt=10"`Name string `form:"name" binding:"NotNullAndAdmin"`Address string `form:"address" binding:"required"`}// 自定义校验方法func nameNotNullAndAdmin(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {if value, ok := field.Interface().(string); ok {// 字段不能为空,并且不等于 adminreturn value != "" && !("5lmh" == value)}return true}func main() {r := gin.Default()if v, ok := binding.Validator.Engine().(*validator.Validate); ok {v.RegisterValidation("NotNullAndAdmin", nameNotNullAndAdmin)}r.GET("/test", func(c *gin.Context) {var person Personif err := c.ShouldBind(&person); err == nil {c.String(200, "%v", person)} else {c.String(500, "person bind err:%v", err.Error())}})r.Run()}
