【问题标题】:Golang reflection on interface vs pointer-to-interface接口上的 Golang 反射与指向接口的指针
【发布时间】:2015-05-01 00:05:25
【问题描述】:

在 gob 使用示例http://golang.org/src/encoding/gob/example_interface_test.go 中,他们提供了以下论点: Pass pointer to interface so Encode sees (and hence sends) a value of interface type. If we passed p directly it would see the concrete type instead. See the blog post, "The Laws of Reflection" for background.

我已经阅读了两遍《反思法则》,以及一篇相关的 Russ Cox 文章。但是我在那里找不到指针到接口和接口之间的区别。

那么为什么通过指针它看到一个接口类型的值,而没有指针它看到(令我惊讶的是)具体类型?

【问题讨论】:

    标签: go


    【解决方案1】:

    在我看来,相关部分是this

    继续,我们可以这样做:

    var empty interface{}
    empty = w
    

    我们的空接口值 empty 将再次包含相同的对 (tty, *os.File)。 这很方便:一个空接口可以保存任何值并包含我们可以保存的所有信息需要关于那个值。

    (强调)

    当您将接口值分配给interface{} 类型的值时,新值的“指向数据”部分不会指向旧值,而是指向旧值所指向的数据。我们可以用一点unsafe 代码来证明:

    type iface struct {
        Type, Data unsafe.Pointer
    }
    
    var r io.Reader = &bytes.Buffer{}
    var i interface{} = r
    
    rr := *(*iface)(unsafe.Pointer(&r))
    ii := *(*iface)(unsafe.Pointer(&i))
    
    fmt.Printf("%v\n", ii.Data == rr.Data) // Prints true.
    

    另一方面,如果我们使用指针,它指向接口值本身。所以现在reflect 可以真正看到,我们到底在说什么接口。例如:

    var i2 interface{} = &r
    ii2 := *(*iface)(unsafe.Pointer(&i2))
    fmt.Printf("%v\n", ii2.Data == unsafe.Pointer(&r)) // Prints true.
    

    游乐场:http://play.golang.org/p/0ZEMdIFhIj

    【讨论】:

    • 感谢您指点方向并提供有用的示例。
    猜你喜欢
    • 2018-11-06
    • 2018-10-14
    • 2016-11-30
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多