reflect: handle map-keys-as-interfaces for MapIter()

Этот коммит содержится в:
Damian Gryski 2023-03-18 09:41:19 -07:00 коммит произвёл Ron Evans
родитель 3612b7749e
коммит bedd27b20e

Просмотреть файл

@ -846,9 +846,13 @@ func (v Value) MapRange() *MapIter {
panic(&ValueError{Method: "MapRange", Kind: v.Kind()}) panic(&ValueError{Method: "MapRange", Kind: v.Kind()})
} }
keyType := v.typecode.Key().(*rawType)
isKeyStoredAsInterface := keyType.Kind() != String && !keyType.isBinary()
return &MapIter{ return &MapIter{
m: v, m: v,
it: hashmapNewIterator(), it: hashmapNewIterator(),
keyInterface: isKeyStoredAsInterface,
} }
} }
@ -858,7 +862,8 @@ type MapIter struct {
key Value key Value
val Value val Value
valid bool valid bool
keyInterface bool
} }
func (it *MapIter) Key() Value { func (it *MapIter) Key() Value {
@ -866,6 +871,12 @@ func (it *MapIter) Key() Value {
panic("reflect.MapIter.Key called on invalid iterator") panic("reflect.MapIter.Key called on invalid iterator")
} }
if it.keyInterface {
intf := *(*interface{})(it.key.value)
v := ValueOf(intf)
return v
}
return it.key.Elem() return it.key.Elem()
} }