一尘不染

获取接口内部的值地址

go

如何在接口内部获取值的地址?

我有一个结构存储在接口的list.List元素中:

import "container/list"
type retry struct{}
p := &el.Value.(retry)

但是我得到这个:

cannot take the address of el.Value.(retry)

这是怎么回事?由于该结构存储在接口中,为什么我不能获得指向它的指针?


阅读 224

收藏
2020-07-02

共1个答案

一尘不染

要了解为什么不可能这样做,考虑一下接口变量实际上是什么很有帮助。接口值占两个字,第一个描述所包含值的类型,第二个(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软件包之外)。

如果您需要一个指向要存储在列表中的结构的指针,那么一种选择是将指针存储到列表中的结构,而不是直接存储结构值。另外,您可以将*list.Element值作为对所包含结构的引用。

2020-07-02