reflect: unpack interfaces in MapKeys() if needed
Этот коммит содержится в:
родитель
f7880e73d8
коммит
a5ddc68845
2 изменённых файлов: 24 добавлений и 1 удалений
|
@ -779,8 +779,17 @@ func (v Value) MapKeys() []Value {
|
||||||
k := New(v.typecode.Key())
|
k := New(v.typecode.Key())
|
||||||
e := New(v.typecode.Elem())
|
e := New(v.typecode.Elem())
|
||||||
|
|
||||||
|
keyType := v.typecode.Key().(*rawType)
|
||||||
|
isKeyStoredAsInterface := keyType.Kind() != String && !keyType.isBinary()
|
||||||
|
|
||||||
for hashmapNext(v.pointer(), it, k.value, e.value) {
|
for hashmapNext(v.pointer(), it, k.value, e.value) {
|
||||||
keys = append(keys, k.Elem())
|
if isKeyStoredAsInterface {
|
||||||
|
intf := *(*interface{})(k.value)
|
||||||
|
v := ValueOf(intf)
|
||||||
|
keys = append(keys, v)
|
||||||
|
} else {
|
||||||
|
keys = append(keys, k.Elem())
|
||||||
|
}
|
||||||
k = New(v.typecode.Key())
|
k = New(v.typecode.Key())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -134,6 +134,20 @@ func TestTinyMap(t *testing.T) {
|
||||||
t.Errorf("m[hello, 4]=%v, want 6", six)
|
t.Errorf("m[hello, 4]=%v, want 6", six)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keys := refsimap.MapKeys()
|
||||||
|
if len(keys) != 1 {
|
||||||
|
t.Errorf("refsimap: MapKeys()=%v, want 1", len(keys))
|
||||||
|
}
|
||||||
|
if keys[0].Type() != TypeOf(stringint{}) {
|
||||||
|
t.Errorf("keys[0] has wrong type: %v", keys[0].Type().String())
|
||||||
|
}
|
||||||
|
|
||||||
|
sikey := keys[0].Interface().(stringint)
|
||||||
|
|
||||||
|
if sikey != (stringint{"hello", 4}) {
|
||||||
|
t.Errorf("sikey has unexpected value: %#v", sikey)
|
||||||
|
}
|
||||||
|
|
||||||
// make sure we can look up interface keys with reflection
|
// make sure we can look up interface keys with reflection
|
||||||
type unmarshalerText struct {
|
type unmarshalerText struct {
|
||||||
A, B string
|
A, B string
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче