From: Rob Pike Date: Wed, 20 Oct 2010 04:25:28 +0000 (-0700) Subject: reflect: add InterfaceValue.Get to enable setting of an interface X-Git-Tag: weekly.2010-10-20~14 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=97f3a80d9319a644da91c8d49b3fd788bee185c0;p=gostls13.git reflect: add InterfaceValue.Get to enable setting of an interface value (through unsafe means) without having a reflect.Type of type *interface{} (pointer to interface). This is needed to make gob able to handle interface values by a method analogous to the way it handles maps. R=rsc CC=golang-dev https://golang.org/cl/2597041 --- diff --git a/src/pkg/reflect/value.go b/src/pkg/reflect/value.go index dd677b4ea8..60e0d90deb 100644 --- a/src/pkg/reflect/value.go +++ b/src/pkg/reflect/value.go @@ -843,11 +843,17 @@ type InterfaceValue struct { value "interface" } -// No Get because v.Interface() is available. - // IsNil returns whether v is a nil interface value. func (v *InterfaceValue) IsNil() bool { return v.Interface() == nil } +// No single uinptr Get because v.Interface() is available. + +// Get returns the two words that represent an interface in the runtime. +// Those words are useful only when playing unsafe games. +func (v *InterfaceValue) Get() [2]uintptr { + return *(*[2]uintptr)(v.addr) +} + // Elem returns the concrete value stored in the interface value v. func (v *InterfaceValue) Elem() Value { return NewValue(v.Interface()) }