【问题标题】:How to obtain the address of an object referenced by an interface如何获取接口引用的对象的地址
【发布时间】:2021-01-02 18:16:56
【问题描述】:

我有两个想要相互比较的接口对象。我不仅想比较它们的值是否相同,我还想知道这两个接口是否引用了同一个对象,或者它们是否引用了具有相同值的两个不同对象。

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

【问题讨论】:

    标签: go pointers types


    【解决方案1】:

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

    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
    }
    

    【讨论】:

      【解决方案2】:

      这里要小心。

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

      当然你可以在接口值中存储一个指向你的值的指针iff指针类型满足接口。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        • 1970-01-01
        • 2010-12-26
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        相关资源
        最近更新 更多