From bedd27b20e84d3db0941f829125d210c16e7fefc Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Sat, 18 Mar 2023 09:41:19 -0700 Subject: [PATCH] reflect: handle map-keys-as-interfaces for MapIter() --- src/reflect/value.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/reflect/value.go b/src/reflect/value.go index a5f6782f..025d8618 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -846,9 +846,13 @@ func (v Value) MapRange() *MapIter { panic(&ValueError{Method: "MapRange", Kind: v.Kind()}) } + keyType := v.typecode.Key().(*rawType) + isKeyStoredAsInterface := keyType.Kind() != String && !keyType.isBinary() + return &MapIter{ - m: v, - it: hashmapNewIterator(), + m: v, + it: hashmapNewIterator(), + keyInterface: isKeyStoredAsInterface, } } @@ -858,7 +862,8 @@ type MapIter struct { key Value val Value - valid bool + valid bool + keyInterface bool } func (it *MapIter) Key() Value { @@ -866,6 +871,12 @@ func (it *MapIter) Key() Value { 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() }