为了账号安全,请及时绑定邮箱和手机立即绑定

获取接口内值的地址

获取接口内值的地址

Go
繁星点点滴滴 2021-06-05 09:04:26
如何获取接口内值的地址?我有一个存储在接口中的结构体,在一个 list.List 元素中:import "container/list"type retry struct{}p := &el.Value.(retry)但我明白了:cannot take the address of el.Value.(retry)这是怎么回事?既然结构体存储在接口中,为什么我不能得到指向它的指针呢?
查看完整描述

3 回答

?
慕盖茨4494581

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值作为对所包含结构的引用传递。


查看完整回答
反对 回复 2021-06-07
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

在第一个近似值中:你不能那样做。即使你可以,p它本身也必须有类型interface{}并且不会有太大帮助 - 你不能直接取消引用它。

强制性问题是:你想解决什么问题?

最后但并非最不重要的一点:接口定义行为而不是结构。直接使用接口的底层实现类型通常会破坏接口契约,尽管可能存在非一般的合法情况。但是,对于一组有限的静态已知类型,类型 switch 语句已经提供了这些。


查看完整回答
反对 回复 2021-06-07
?
慕工程0101907

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 也可以是复合文字。


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信