如何在接口内部获取值的地址?
我有一个结构存储在接口的list.List元素中:
import "container/list" type retry struct{} p := &el.Value.(retry)
但是我得到这个:
cannot take the address of el.Value.(retry)
这是怎么回事?由于该结构存储在接口中,为什么我不能获得指向它的指针?
要了解为什么不可能这样做,考虑一下接口变量实际上是什么很有帮助。接口值占两个字,第一个描述所包含值的类型,第二个(a)保存所包含的值(如果它适合字内)或(b)指向该值的存储指针(如果该值不适合一个单词)。
需要注意的重要事项是:(1)包含的值属于接口变量,并且(2)当为变量分配新值时,可以重复使用该值的存储。知道这一点,请考虑以下代码:
var v interface{} v = int(42) p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42 v = &SomeStruct{...}
现在,该整数的存储已被重用以保存指针,并且*p现在是该指针的整数表示。您可以看到它具有打破类型系统的能力,因此Go并没有提供执行此操作的方法(除了使用unsafe软件包之外)。
*p
unsafe
如果您需要一个指向要存储在列表中的结构的指针,那么一种选择是将指针存储到列表中的结构,而不是直接存储结构值。另外,您可以将*list.Element值作为对所包含结构的引用。
*list.Element