@@ -372,7 +372,7 @@ func (b *Binding) getOrPrepareReceiver(value reflect.Value) (*receiver, error) {
372372 return nil , b .bindErrFactory (errExprSelector .String (), errMsg )
373373 }
374374 if ! recv .hasVd {
375- recv .hasVd , _ = b .findVdTag (ameda .DereferenceType (t ), false , 20 )
375+ recv .hasVd , _ = b .findVdTag (ameda .DereferenceType (t ), false , 20 , map [reflect. Type ] bool {} )
376376 }
377377 recv .initParams ()
378378
@@ -383,13 +383,14 @@ func (b *Binding) getOrPrepareReceiver(value reflect.Value) (*receiver, error) {
383383 return recv , nil
384384}
385385
386- func (b * Binding ) findVdTag (t reflect.Type , inMapOrSlice bool , depth int ) (hasVd bool , err error ) {
387- if depth <= 0 {
386+ func (b * Binding ) findVdTag (t reflect.Type , inMapOrSlice bool , depth int , exist map [reflect. Type ] bool ) (hasVd bool , err error ) {
387+ if depth <= 0 || exist [ t ] {
388388 return
389389 }
390390 depth --
391391 switch t .Kind () {
392392 case reflect .Struct :
393+ exist [t ] = true
393394 for i := t .NumField () - 1 ; i >= 0 ; i -- {
394395 field := t .Field (i )
395396 if inMapOrSlice {
@@ -400,14 +401,14 @@ func (b *Binding) findVdTag(t reflect.Type, inMapOrSlice bool, depth int) (hasVd
400401 }
401402 }
402403 }
403- hasVd , _ = b .findVdTag (ameda .DereferenceType (field .Type ), inMapOrSlice , depth )
404+ hasVd , _ = b .findVdTag (ameda .DereferenceType (field .Type ), inMapOrSlice , depth , exist )
404405 if hasVd {
405406 return true , nil
406407 }
407408 }
408409 return false , nil
409410 case reflect .Slice , reflect .Array , reflect .Map :
410- return b .findVdTag (ameda .DereferenceType (t .Elem ()), true , depth )
411+ return b .findVdTag (ameda .DereferenceType (t .Elem ()), true , depth , exist )
411412 default :
412413 return false , nil
413414 }
0 commit comments