From 823c9c25cf05d8153b2c47270868911e0f0b659d Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Thu, 11 Nov 2021 22:13:30 +0100 Subject: [PATCH] reflect: implement Value.Elem() for interface values --- src/reflect/value.go | 9 ++++++++- testdata/reflect.go | 5 +++++ testdata/reflect.txt | 28 ++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/reflect/value.go b/src/reflect/value.go index 10cf4f74..fd19eff7 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -400,7 +400,14 @@ func (v Value) Elem() Value { value: ptr, flags: v.flags | valueFlagIndirect, } - default: // not implemented: Interface + case Interface: + typecode, value := decomposeInterface(*(*interface{})(v.value)) + return Value{ + typecode: typecode, + value: value, + flags: v.flags &^ valueFlagIndirect, + } + default: panic(&ValueError{"Elem"}) } } diff --git a/testdata/reflect.go b/testdata/reflect.go index 2b7dbc04..ac5b7ee0 100644 --- a/testdata/reflect.go +++ b/testdata/reflect.go @@ -120,6 +120,8 @@ func main() { &linkedList{ foo: 42, }, + // interfaces + []interface{}{3, "str", -4 + 2.5i}, } { showValue(reflect.ValueOf(v), "") } @@ -377,6 +379,9 @@ func showValue(rv reflect.Value, indent string) { case reflect.Interface: println(indent + " interface") println(indent+" nil:", rv.IsNil()) + if !rv.IsNil() { + showValue(rv.Elem(), indent+" ") + } case reflect.Map: println(indent + " map") println(indent+" nil:", rv.IsNil()) diff --git a/testdata/reflect.txt b/testdata/reflect.txt index 19642949..4ef44cdb 100644 --- a/testdata/reflect.txt +++ b/testdata/reflect.txt @@ -334,6 +334,34 @@ reflect type: ptr exported: false reflect type: int addrable=true int: 42 +reflect type: slice comparable=false + slice: interface 3 3 + pointer: true + nil: false + indexing: 0 + reflect type: interface settable=true addrable=true + interface + nil: false + reflect type: int + int: 3 + indexing: 1 + reflect type: interface settable=true addrable=true + interface + nil: false + reflect type: string + string: str 3 + reflect type: uint8 + uint: 115 + reflect type: uint8 + uint: 116 + reflect type: uint8 + uint: 114 + indexing: 2 + reflect type: interface settable=true addrable=true + interface + nil: false + reflect type: complex128 + complex: (-4.000000e+000+2.500000e+000i) reflect type: ptr pointer: true int8 nil: false