结构体验证

使用gin框架的数据校验,可以不用解析数据,简少代码量。

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. )
  7. type Person struct {
  8. Age int `form:"age" binding:"required,gt=10"`
  9. Name string `form:"name" binding:"required"`
  10. Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc
  11. }
  12. func main() {
  13. r := gin.Default()
  14. r.GET("/text", func(c *gin.Context) {
  15. var person Person
  16. if err := c.ShouldBind(&persion); err != nil {
  17. c.String(500, fmt.Sprint(err))
  18. return
  19. }
  20. c.String(200, fmt.Sprint("%#", person))
  21. })
  22. r.Run()
  23. }

自定义校验

  1. package main
  2. import (
  3. "net/http"
  4. "reflect"
  5. "github.com/gin-gonic/gin"
  6. "github.com/gin-gonic/gin/binding"
  7. "gopkg.in/go-playground/validator.v8"
  8. )
  9. type Person struct {
  10. Age int `form:"age" binding:"required,gt=10"`
  11. Name string `form:"name" binding:"NotNullAndAdmin"`
  12. Address string `form:"address" binding:"required"`
  13. }
  14. // 自定义校验方法
  15. func nameNotNullAndAdmin(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
  16. if value, ok := field.Interface().(string); ok {
  17. // 字段不能为空,并且不等于 admin
  18. return value != "" && !("5lmh" == value)
  19. }
  20. return true
  21. }
  22. func main() {
  23. r := gin.Default()
  24. if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
  25. v.RegisterValidation("NotNullAndAdmin", nameNotNullAndAdmin)
  26. }
  27. r.GET("/test", func(c *gin.Context) {
  28. var person Person
  29. if err := c.ShouldBind(&person); err == nil {
  30. c.String(200, "%v", person)
  31. } else {
  32. c.String(500, "person bind err:%v", err.Error())
  33. }
  34. })
  35. r.Run()
  36. }