Go 中接口如何表示?
各种资源描述了 Go 中接口的表示,但有些可能看起来相互矛盾。本文旨在通过强调两种此类资源之间的粒度差异来澄清混淆。
理解差异
标题为“反射定律”的文章重点介绍了如何使用反射检查对象的低级细节。它解释了接口值包含一对(值,类型)。例如,以下代码中的变量 r 被描述为具有 (tty, *os.File) 对:
<code class="go">var r io.Reader tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0) if err != nil { return nil, err } r = tty</code>
另一方面,第二篇文章检查了接口的动态调度属性。它解释了运行时根据与接口实现关联的“itable”来解析接口方法。例如,在持有 Binary 类型的 Stringer 接口的图中,itable 列出了用于满足该接口 (String) 的方法,但没有列出 Binary 类型实现的其他方法。
协调差异
这两个资源在不同的抽象级别讨论相同的概念。第一个讨论反射的实现,第二个重点讨论运行时行为。
在运行时,接口充当“包装对象”,提供有关包装对象的信息以方便动态调度。这解释了为什么在第一个示例中调用 r 上的 Read 有效:它使用 itable 来定位 *os.File 类型中的 Read 函数实现。
总之,将接口理解为运行时“包装对象”,它提供动态调度信息。反射以(值,类型)对的形式提供了更高级别的表示。
以上是Go 中的接口如何工作:反射与运行时行为?的详细内容。更多信息请关注PHP中文网其他相关文章!