@@ -219,6 +219,7 @@ func (d *formDecoder) traverseStruct(v reflect.Value, namespace string) (set boo
219219 // is anonymous struct, cannot parse or cache as
220220 // it has no name to index by
221221 if len (typ .Name ()) == 0 {
222+
222223 numFields := v .NumField ()
223224 var fld reflect.StructField
224225 var key string
@@ -391,7 +392,11 @@ func (d *formDecoder) setFieldByType(current reflect.Value, namespace string, id
391392 if v .IsNil () {
392393 varr = reflect .MakeSlice (v .Type (), sl , sl )
393394 } else if v .Len () < sl {
394- varr = reflect .MakeSlice (v .Type (), sl , sl )
395+ if v .Cap () <= sl {
396+ varr = reflect .MakeSlice (v .Type (), sl , sl )
397+ } else {
398+ varr = reflect .MakeSlice (v .Type (), sl , v .Cap ())
399+ }
395400 reflect .Copy (varr , v )
396401 } else {
397402 varr = v
@@ -426,7 +431,11 @@ func (d *formDecoder) setFieldByType(current reflect.Value, namespace string, id
426431 if v .IsNil () {
427432 varr = reflect .MakeSlice (v .Type (), len (arr ), len (arr ))
428433 } else if v .Len () < len (arr ) {
429- varr = reflect .MakeSlice (v .Type (), len (arr ), len (arr ))
434+ if v .Cap () <= len (arr ) {
435+ varr = reflect .MakeSlice (v .Type (), len (arr ), len (arr ))
436+ } else {
437+ varr = reflect .MakeSlice (v .Type (), len (arr ), v .Cap ())
438+ }
430439 reflect .Copy (varr , v )
431440 } else {
432441 existing = true
@@ -520,7 +529,8 @@ func (d *formDecoder) getMapKey(key string, current reflect.Value, namespace str
520529 v , kind := d .d .ExtractType (current )
521530
522531 switch kind {
523- case reflect .Interface , reflect .Invalid :
532+ case reflect .Interface :
533+ v .Set (reflect .ValueOf (key ))
524534 return
525535 case reflect .Ptr :
526536
0 commit comments