3 回答
TA贡献1850条经验 获得超11个赞
要理解为什么这是不可能的,考虑一下接口变量实际上是什么是有帮助的。一个接口值占用两个词,第一个描述所包含值的类型,第二个或者 (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值作为对所包含结构的引用传递。
TA贡献1828条经验 获得超13个赞
在第一个近似值中:你不能那样做。即使你可以,p
它本身也必须有类型interface{}
并且不会有太大帮助 - 你不能直接取消引用它。
强制性问题是:你想解决什么问题?
最后但并非最不重要的一点:接口定义行为而不是结构。直接使用接口的底层实现类型通常会破坏接口契约,尽管可能存在非一般的合法情况。但是,对于一组有限的静态已知类型,类型 switch 语句已经提供了这些。
TA贡献1887条经验 获得超5个赞
获取指向接口值的指针?
给定接口类型的变量,有没有办法获取指向存储在变量中的值的指针?
这不可能。
罗伯·派克
接口值不一定是可寻址的。例如,
package main
import "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 也可以是复合文字。
- 3 回答
- 0 关注
- 184 浏览
添加回答
举报