Go 如何获取对接口值的引用
是否有可能获得对接口值的引用 重新回到反思?若否,原因为何 我曾尝试:Go 如何获取对接口值的引用,go,Go,是否有可能获得对接口值的引用 重新回到反思?若否,原因为何 我曾尝试: package foo type Foo struct { a, b int } func f(x interface{}) { var foo *Foo = &x.(Foo) foo.a = 2 } func g(foo Foo) { f(foo) } 但它在以下方面失败了: ./test.go:8: cannot take the address of x.(Foo) 如
package foo
type Foo struct {
a, b int
}
func f(x interface{}) {
var foo *Foo = &x.(Foo)
foo.a = 2
}
func g(foo Foo) {
f(foo)
}
但它在以下方面失败了:
./test.go:8: cannot take the address of x.(Foo)
如果你按意思去做,就可以消除你的疑虑 自信而有力地陈述事实或信仰 在您的示例中,
x.(Foo)
只是一个类型断言,它不是一个对象,因此您无法获取它的地址
例如,在运行时创建对象时
var c interface{} = 5
d := c.(int)
fmt.Println("Hello", c, d) // Hello 5 5
它只是断言
断言c不是nil,并且存储在c中的值是int类型
因此,它不是内存中的任何物理实体,而是在运行时,d
将根据断言的类型分配内存,然后将c的内容复制到该位置
所以你可以做一些像
var c interface{} = 5
d := &c
fmt.Println("Hello", (*d).(int)) // hello 5
希望我消除了你的困惑。你不能。接口中的值不可寻址。如果您需要一个指针,请在接口中放置一个指针。正如JimB指出的,它是不可寻址的。接口值保存原始文件的副本,因此没有意义。请参阅相关/可能重复的问题:@icza。你真的帮助我理解了