2 回答

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

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 關注
- 131 瀏覽
添加回答
舉報