警告
本文最后更新于 2023-03-02 20:11,文中内容可能已过时。
一、注册验证器
1
2
3
| if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("myValidate", myValidateFun) // 指定tag名称和处理函数
}
|
binding.Validator.Engine()
会return
一个any
类型的实例,查看源码可以知道最终return
的是*Validate
类型的数据,所以需要将这个any
类型的数据断言成*Validate
类型,这个类型在这个包下(github.com/go-playground/validator/v10),所以我们需要写成*validator.Validate
二、处理函数
通过fl
可以拿到当前处理的字段值,但是他的类型是reflect.Value
, 我们需要将他转换为目标类型之前,需要先使用Interface()
方法将他转换为空接口
类型,然后再将他断言为目标类型, 接下来就可以自己写逻辑了,return true
代表校验成功
1
2
3
4
5
6
7
8
9
10
11
| func myValidateFun(fl validator.FieldLevel) bool {
// fl.Param() // 获取参数,比如binding:"myValidate=100"
if value, ok := fl.Field().Interface().(string); ok {
if value != "admin" {
return true
}
return false
}
return false
}
|
三、使用自定义校验器
1
2
3
4
5
| type userInfo struct {
Name string `json:"name" binding:"required,myValidate"`
Age int `json:"age"`
Sex string `json:"sex"`
}
|
完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| package main
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
)
func myValidateFun(fl validator.FieldLevel) bool {
//fl.Param()
if value, ok := fl.Field().Interface().(string); ok {
if value != "admin" {
return true
}
return false
}
return false
}
func main() {
type userInfo struct {
Name string `json:"name" binding:"required,myValidate=10"`
Age int `json:"age"`
Sex string `json:"sex"`
}
r := gin.Default()
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("myValidate", myValidateFun)
}
r.POST("/shouldBind", func(c *gin.Context) {
var user userInfo
err := c.ShouldBind(&user)
if err != nil {
c.String(200, err.Error())
}
c.JSON(200, user)
})
err := r.Run()
if err != nil {
return
}
}
|