【发布时间】:2021-01-02 18:16:56
【问题描述】:
我有两个想要相互比较的接口对象。我不仅想比较它们的值是否相同,我还想知道这两个接口是否引用了同一个对象,或者它们是否引用了具有相同值的两个不同对象。
有没有办法从接口对象中提取接口引用的地址?然后我可以只比较这两个地址,就知道这两个接口是否引用了同一个对象。
【问题讨论】:
我有两个想要相互比较的接口对象。我不仅想比较它们的值是否相同,我还想知道这两个接口是否引用了同一个对象,或者它们是否引用了具有相同值的两个不同对象。
有没有办法从接口对象中提取接口引用的地址?然后我可以只比较这两个地址,就知道这两个接口是否引用了同一个对象。
【问题讨论】:
如果两个接口都有指针值,那么你可以简单地比较它们:
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
}
【讨论】:
这里要小心。
两个不同的接口值永远不能“引用”“同一个对象”,因为接口值总是包含您包装在接口值中的值的副本。变量 identity (您的“相同对象”)将是“相等地址”,对于包装在接口值中的值未定义,因为这些包装值不可寻址。所以明确拒绝你的问题。
当然你可以在接口值中存储一个指向你的值的指针iff指针类型满足接口。
最好避免谈论“对象”和“引用”。 Go 具有某些类型的值。一些值是可寻址的。您可以将可寻址值的地址存储在适当类型的指针变量中。
【讨论】: