我正在使用 go gin 在我的项目中创建 api。我需要创建自定义验证器,因此我创建了如下内容:
var valueone validator.func = func(fl validator.fieldlevel) bool { value, ok := fl.field() if ok { if value != "one" { return true } } return true } var valuetwo validator.func = func(fl validator.fieldlevel) bool { value, ok := fl.field() if ok { if value != "two" { return true } } return true } ....
有没有办法创建一个更通用且可用于两种情况的单个验证器,而不是多次创建几乎相同的自定义验证器,例如:
var value validator.Func = func(fl validator.FieldLevel, param) bool { value, ok := fl.Field() if ok { if value != param { return true } } return true }
我无法找到一种方法将参数传递给杜松子酒中的自定义验证器或通过任何其他可能的方式制作这些通用验证器。我需要创建数千个几乎相似的验证器,但我不想为每个验证器创建自定义验证器。
您无法更改函数结构,因为这是它在包中定义的方式。
// func accepts a fieldlevel interface for all validation needs. the return // value should be true when validation succeeds. type func func(fl fieldlevel) bool
相反,我们可以尝试使用参数自定义验证标记
请参阅下面的示例
package main import ( "github.com/go-playground/validator" ) type Data struct { One string `json:"one" validate:"custom_validation=one"` Two string `json:"two" validate:"custom_validation=two"` } var validate *validator.Validate func main() { validate = validator.New() err := validate.RegisterValidation("custom_validation", func(fl validator.FieldLevel) bool { value := fl.Field() param := fl.Param() return value.String() == param }) if err != nil { panic(err) } // this will succeed { data := &Data{ One: "one", Two: "two", } err = validate.Struct(data) if err != nil { panic(err) } } // it will fail here { data := &Data{ Two: "one", One: "two", } err = validate.Struct(data) if err != nil { panic(err) } } }
在此处查看更多示例
注意:golang不支持!==