Addressing Value Within an Interface
Attempting to obtain the address of a value stored in an interface often leads to errors, such as "cannot take the address of el.Value.(retry)". To comprehend this limitation, we must examine the nature of interface variables.
An interface variable consists of two parts: one describing the type of the contained value and the other either directly storing the value or holding a pointer to its storage. The value stored in an interface is owned by the interface variable itself. Furthermore, the storage for this value can be reused when the interface is assigned a new value.
As an example:
<code class="go">var v interface{} v = int(42) p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42 v = &SomeStruct{...}</code>
In this scenario, the storage used to hold the integer is repurposed to hold a pointer, rendering the value at *p an invalid integer representation of the new pointer. This behavior could easily undermine the type system, and for this reason, Go does not provide a direct way to obtain addresses of interface values (outside of using the unsafe package).
If you require pointers to structures stored in a list, consider storing pointers to the structures themselves rather than the structures directly. Alternatively, you can use *list.Element values as references to the contained structures.
The above is the detailed content of Why Can\'t I Get the Address of a Value Stored in a Go Interface?. For more information, please follow other related articles on the PHP Chinese website!