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