2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
搜索了一段時(shí)間后,我終于找到了一個(gè)名為的函數(shù),該函數(shù)注冊了一個(gè)自定義類型,這將使驗(yàn)證它成為可能。因此,解決方案是將以下內(nèi)容添加到問題中的示例中: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{})
現(xiàn)在驗(yàn)證器將進(jìn)入函數(shù),并且返回消息將是字段的錯誤myValidateParentStruct.Child

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
該函數(shù)正在注冊字段級別的自定義驗(yàn)證程序,如已注冊函數(shù)的類型所示。validator.RegisterValidation(...)func(fl validator.FieldLevel) bool
結(jié)構(gòu)字段本身不會以這種方式進(jìn)行驗(yàn)證,并且您的自定義驗(yàn)證程序?qū)⒈缓雎浴?/p>
要驗(yàn)證結(jié)構(gòu)字段,應(yīng)使用 ,其中函數(shù)的類型為 。validate.RegisterStructValidation(myValidate, ChildStruct{})myValidatevalidator.StructLevelFunc
在此函數(shù)中,您可以對結(jié)構(gòu)、字段本身和/或其嵌套字段執(zhí)行驗(yàn)證:
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 關(guān)注
- 136 瀏覽
添加回答
舉報(bào)