@@ -137,9 +137,9 @@ func (d *decoder) parseMapData() {
137137 }
138138}
139139
140- func (d * decoder ) traverseStruct (v reflect.Value , namespace []byte ) (set bool ) {
140+ func (d * decoder ) traverseStruct (v reflect.Value , typ reflect. Type , namespace []byte ) (set bool ) {
141141
142- typ := v .Type ()
142+ // typ := v.Type()
143143 l := len (namespace )
144144 first := l == 0
145145
@@ -195,6 +195,7 @@ func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx in
195195 }
196196 }
197197
198+ // fmt.Println("KIND:", kind)
198199 switch kind {
199200 case reflect .Interface , reflect .Invalid :
200201 return
@@ -464,35 +465,35 @@ func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx in
464465 }
465466
466467 var varr reflect.Value
467- var existing bool
468+
469+ var ol int
470+ l := len (arr )
468471
469472 if v .IsNil () {
470473 varr = reflect .MakeSlice (v .Type (), len (arr ), len (arr ))
471- } else if v .Len () < len (arr ) {
472- if v .Cap () <= len (arr ) {
473- varr = reflect .MakeSlice (v .Type (), len (arr ), len (arr ))
474+ } else {
475+
476+ ol = v .Len ()
477+ l += ol
478+
479+ if v .Cap () <= l {
480+ varr = reflect .MakeSlice (v .Type (), l , l )
474481 } else {
475- varr = reflect .MakeSlice (v .Type (), len (arr ), v .Cap ())
482+ // preserve predefined capacity, possibly for reuse after decoding
483+ varr = reflect .MakeSlice (v .Type (), l , v .Cap ())
476484 }
477485 reflect .Copy (varr , v )
478- } else {
479- existing = true
480- varr = v
481486 }
482487
483- for i := 0 ; i < len ( arr ) ; i ++ {
488+ for i := ol ; i < l ; i ++ {
484489 newVal := reflect .New (v .Type ().Elem ()).Elem ()
485490
486- if d .setFieldByType (newVal , namespace , i ) {
491+ if d .setFieldByType (newVal , namespace , i - ol ) {
487492 set = true
488493 varr .Index (i ).Set (newVal )
489494 }
490495 }
491496
492- if ! set || existing {
493- return
494- }
495-
496497 v .Set (varr )
497498
498499 case reflect .Map :
@@ -544,8 +545,10 @@ func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx in
544545
545546 case reflect .Struct :
546547
548+ typ := v .Type ()
549+ // fmt.Println("Type:", typ)
547550 // if we get here then no custom time function declared so use RFC3339 by default
548- if v . Type () == timeType {
551+ if typ == timeType {
549552
550553 if ! ok || len (arr [idx ]) == 0 {
551554 return
@@ -568,7 +571,7 @@ func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx in
568571 return
569572 }
570573
571- set = d .traverseStruct (v , namespace )
574+ set = d .traverseStruct (v , typ , namespace )
572575 }
573576
574577 return
0 commit comments