猿问

获取接口内值的地址

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


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


import "container/list"

type retry struct{}

p := &el.Value.(retry)

但我明白了:


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

这是怎么回事?既然结构体存储在接口中,为什么我不能得到指向它的指针呢?


繁星点点滴滴
浏览 185回答 3
3回答

慕盖茨4494581

要理解为什么这是不可能的,考虑一下接口变量实际上是什么是有帮助的。一个接口值占用两个词,第一个描述所包含值的类型,第二个或者 (a) 保存所包含的值(如果它适合这个词)或 (b) 一个指向存储值的指针(如果该值不适合一个单词)。需要注意的重要事项是 (1) 包含的值属于接口变量,以及 (2) 在为变量分配新值时,该值的存储可能会被重用。知道了这一点,请考虑以下代码:var v interface{}v = int(42)p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42v = &SomeStruct{...}现在整数的存储已被重新用于保存指针,*p现在是该指针的整数表示。你可以看到它是如何有能力打破类型系统的,所以 Go 没有提供一种方法来做到这一点(除了使用unsafe包之外)。如果您需要一个指向存储在列表中的结构的指针,那么一种选择是将指向列表中的结构的指针而不是直接存储结构值。或者,您可以将*list.Element值作为对所包含结构的引用传递。

慕田峪7331174

在第一个近似值中:你不能那样做。即使你可以,p它本身也必须有类型interface{}并且不会有太大帮助 - 你不能直接取消引用它。强制性问题是:你想解决什么问题?最后但并非最不重要的一点:接口定义行为而不是结构。直接使用接口的底层实现类型通常会破坏接口契约,尽管可能存在非一般的合法情况。但是,对于一组有限的静态已知类型,类型 switch 语句已经提供了这些。

慕工程0101907

获取指向接口值的指针?给定接口类型的变量,有没有办法获取指向存储在变量中的值的指针?这不可能。罗伯·派克接口值不一定是可寻址的。例如,package mainimport "fmt"func main() {    var i interface{}    i = 42    // cannot take the address of i.(int)    j := &i.(int)    fmt.Println(i, j)}地址运算符对于 T 类型的操作数 x,地址操作 &x 生成一个类型为 *T 的指针,指向 x。操作数必须是可寻址的,即变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x 也可以是复合文字。
随时随地看视频慕课网APP

相关分类

Go
我要回答