Go 如何获取接口引用的对象的地址

Go 如何获取接口引用的对象的地址,go,pointers,types,Go,Pointers,Types,我想比较两个接口对象。我不仅想比较它们的值是否相同,我还想知道这两个接口是引用同一个对象,还是引用两个值相等的不同对象 有没有办法从接口对象提取接口引用的地址?然后我可以比较这两个地址,以了解这两个接口是否引用同一个对象。如果两个接口都有指针值,那么您可以简单地比较它们: func cmp(v1, v2 interface{}) bool { return v1==v2 } func main() { a:=1 b:=1 c:=&a cmp(&a

我想比较两个接口对象。我不仅想比较它们的值是否相同,我还想知道这两个接口是引用同一个对象,还是引用两个值相等的不同对象


有没有办法从接口对象提取接口引用的地址?然后我可以比较这两个地址,以了解这两个接口是否引用同一个对象。

如果两个接口都有指针值,那么您可以简单地比较它们:

func cmp(v1, v2 interface{}) bool {
   return v1==v2
}

func  main() {
   a:=1
   b:=1
   c:=&a
   cmp(&a,&b) // false
   cmp(a, b) // true, compare values
   cmp(c, &a) // true
}
这里要小心

两个不同的接口值永远不能“引用”同一个“对象”,因为接口值始终包含您包装在接口值中的值的副本。变量标识(您的“同一对象”)将是“相等地址”,这对于包装在接口值中的值是未定义的,因为这些包装的值是不可寻址的。所以对你的问题有一个明确的否定

但是,如果指针类型满足接口,当然可以在接口值中存储指向您的值的指针

最好避免谈论“对象”和“参考”。Go具有特定类型的值。有些值是可寻址的。您可以在适当类型的指针变量中存储可寻址值的地址