diff options
Diffstat (limited to 'src/lib/reflect')
-rw-r--r-- | src/lib/reflect/all_test.go | 10 | ||||
-rw-r--r-- | src/lib/reflect/value.go | 11 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/lib/reflect/all_test.go b/src/lib/reflect/all_test.go index 166b20702..e3f6b9b50 100644 --- a/src/lib/reflect/all_test.go +++ b/src/lib/reflect/all_test.go @@ -301,6 +301,16 @@ func TestInterfaceGet(t *testing.T) { assert(v3.Type().String(), "float"); } +func TestInterfaceValue(t *testing.T) { + var inter struct { e interface{ } }; + inter.e = 123.456; + v1 := reflect.NewValue(&inter); + v2 := v1.(reflect.PtrValue).Sub().(reflect.StructValue).Field(0); + assert(v2.Type().String(), "interface { }"); + v3 := v2.(reflect.InterfaceValue).Value(); + assert(v3.Type().String(), "float"); +} + func TestCopyArray(t *testing.T) { a := []int{ 1, 2, 3, 4, 10, 9, 8, 7 }; b := []int{ 11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44 }; diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go index 7bd6f3b15..ad0cd4655 100644 --- a/src/lib/reflect/value.go +++ b/src/lib/reflect/value.go @@ -34,6 +34,8 @@ type Value interface { Interface() interface {}; } +func NewValue(e interface{}) Value; + // commonValue fields and functionality for all values type commonValue struct { @@ -744,6 +746,7 @@ func structCreator(typ Type, addr Addr) Value { type InterfaceValue interface { Value; Get() interface {}; // Get the underlying interface{} value. + Value() Value; } type interfaceValueStruct struct { @@ -754,6 +757,14 @@ func (v *interfaceValueStruct) Get() interface{} { return *(*interface{})(v.addr) } +func (v *interfaceValueStruct) Value() Value { + i := v.Get(); + if i == nil { + return nil; + } + return NewValue(i); +} + func interfaceCreator(typ Type, addr Addr) Value { return &interfaceValueStruct{ commonValue{InterfaceKind, typ, addr} } } |