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。你真的帮助我理解了