@@ -75,9 +75,13 @@ func caseInsensitiveLookup(m, k reflect.Value) (reflect.Value, bool) {
75
75
return v , hreflect .IsTruthfulValue (v )
76
76
}
77
77
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
81
85
}
82
86
}
83
87
@@ -90,17 +94,28 @@ func mergeMap(dst, src reflect.Value) reflect.Value {
90
94
// If the destination is Params, we must lower case all keys.
91
95
_ , lowerCase := dst .Interface ().(maps.Params )
92
96
97
+ k := reflect .New (dst .Type ().Key ()).Elem ()
98
+ v := reflect .New (dst .Type ().Elem ()).Elem ()
99
+
93
100
// 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 )
97
106
}
98
107
99
108
// Add all keys in src not already in destination.
100
109
// 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 )
104
119
105
120
if found {
106
121
// If both are the same map key type, merge.
@@ -112,14 +127,15 @@ func mergeMap(dst, src reflect.Value) reflect.Value {
112
127
}
113
128
114
129
if dve .Type ().Key () == sve .Type ().Key () {
115
- out .SetMapIndex (key , mergeMap (dve , sve ))
130
+ out .SetMapIndex (k , mergeMap (dve , sve ))
116
131
}
117
132
}
118
133
} 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 ()))
121
137
}
122
- out .SetMapIndex (key , sv )
138
+ out .SetMapIndex (kk , sv )
123
139
}
124
140
}
125
141
0 commit comments