@@ -75,9 +75,13 @@ func caseInsensitiveLookup(m, k reflect.Value) (reflect.Value, bool) {
7575 return v , hreflect .IsTruthfulValue (v )
7676 }
7777
78- for _ , key := range m .MapKeys () {
79- if strings .EqualFold (k .String (), key .String ()) {
80- return m .MapIndex (key ), true
78+ k2 := reflect .New (m .Type ().Key ()).Elem ()
79+
80+ iter := m .MapRange ()
81+ for iter .Next () {
82+ k2 .SetIterKey (iter )
83+ if strings .EqualFold (k .String (), k2 .String ()) {
84+ return iter .Value (), true
8185 }
8286 }
8387
@@ -90,17 +94,28 @@ func mergeMap(dst, src reflect.Value) reflect.Value {
9094 // If the destination is Params, we must lower case all keys.
9195 _ , lowerCase := dst .Interface ().(maps.Params )
9296
97+ k := reflect .New (dst .Type ().Key ()).Elem ()
98+ v := reflect .New (dst .Type ().Elem ()).Elem ()
99+
93100 // Copy the destination map.
94- for _ , key := range dst .MapKeys () {
95- v := dst .MapIndex (key )
96- out .SetMapIndex (key , v )
101+ iter := dst .MapRange ()
102+ for iter .Next () {
103+ k .SetIterKey (iter )
104+ v .SetIterValue (iter )
105+ out .SetMapIndex (k , v )
97106 }
98107
99108 // Add all keys in src not already in destination.
100109 // Maps of the same type will be merged.
101- for _ , key := range src .MapKeys () {
102- sv := src .MapIndex (key )
103- dv , found := caseInsensitiveLookup (dst , key )
110+ k = reflect .New (src .Type ().Key ()).Elem ()
111+ sv := reflect .New (src .Type ().Elem ()).Elem ()
112+
113+ iter = src .MapRange ()
114+ for iter .Next () {
115+ sv .SetIterValue (iter )
116+ k .SetIterKey (iter )
117+
118+ dv , found := caseInsensitiveLookup (dst , k )
104119
105120 if found {
106121 // If both are the same map key type, merge.
@@ -112,14 +127,15 @@ func mergeMap(dst, src reflect.Value) reflect.Value {
112127 }
113128
114129 if dve .Type ().Key () == sve .Type ().Key () {
115- out .SetMapIndex (key , mergeMap (dve , sve ))
130+ out .SetMapIndex (k , mergeMap (dve , sve ))
116131 }
117132 }
118133 } else {
119- if lowerCase && key .Kind () == reflect .String {
120- key = reflect .ValueOf (strings .ToLower (key .String ()))
134+ kk := k
135+ if lowerCase && k .Kind () == reflect .String {
136+ kk = reflect .ValueOf (strings .ToLower (k .String ()))
121137 }
122- out .SetMapIndex (key , sv )
138+ out .SetMapIndex (kk , sv )
123139 }
124140 }
125141
0 commit comments