2 回答
![?](http://img1.sycdn.imooc.com/54584cd10001404b02200220-100-100.jpg)
TA贡献1828条经验 获得超6个赞
搜索了一段时间后,我终于找到了一个名为的函数,该函数注册了一个自定义类型,这将使验证它成为可能。因此,解决方案是将以下内容添加到问题中的示例中:RegisterCustomTypeFuncgo-playground/validator/v10
func childStructCustomTypeFunc(field reflect.Value) interface{} {
if value, ok := field.Interface().(ChildStruct); ok {
return value.Value
}
return nil
}
䋰:
validator.RegisterCustomTypeFunc(childStructCustomTypeFunc, ChildStruct{})
现在验证器将进入函数,并且返回消息将是字段的错误myValidateParentStruct.Child
![?](http://img1.sycdn.imooc.com/5458622b000117dd02200220-100-100.jpg)
TA贡献1777条经验 获得超10个赞
该函数正在注册字段级别的自定义验证程序,如已注册函数的类型所示。validator.RegisterValidation(...)func(fl validator.FieldLevel) bool
结构字段本身不会以这种方式进行验证,并且您的自定义验证程序将被忽略。
要验证结构字段,应使用 ,其中函数的类型为 。validate.RegisterStructValidation(myValidate, ChildStruct{})myValidatevalidator.StructLevelFunc
在此函数中,您可以对结构、字段本身和/或其嵌套字段执行验证:
func myValidate(sl validator.StructLevel) {
fmt.Println("INSIDE MY VALIDATOR") // now called
if sl.Current().Interface().(ChildStruct).Value != 20 {
sl.ReportError(sl.Current().Interface(), "ChildStruct", "", "", "")
}
}
func main() {
vald := validator.New()
vald.RegisterStructValidation(myValidate, ChildStruct{})
data := &ParentStruct{
Child: ChildStruct{
Value: 10,
},
}
validateErr := vald.Struct(data)
if validateErr != nil {
fmt.Println("GOT ERROR")
fmt.Println(validateErr)
}
fmt.Println("DONE")
}
操场上的例子:https://play.golang.org/p/f0f2YE_e1VL
- 2 回答
- 0 关注
- 111 浏览
添加回答
举报