教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go语言接口(interface)的实现原理

Go语言接口(interface)的实现原理

发布时间:2021-12-22   编辑:jiaochengji.com
教程集为您提供Go语言接口(interface)的实现原理等资源,欢迎您收藏本站,我们将为您提供最新的Go语言接口(interface)的实现原理资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><blockquote>

整理自《Go IN ACTION》

</blockquote> <h1>1. Go语言的接口与多态</h1>

多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值。标准库里有很好的例子,如io 包里实现的流式处理接口。io 包提供了一组构造得非常好的接口和函数,来让代码轻松支持流式数据处理。只要实现两个接口,就能利用整个io 包背后的所有强大能力。

不过,我们的程序在声明和实现接口时会涉及很多细节。即便实现的是已有接口,也需要了解这些接口是如何工作的。

<h1>
2. Go语言接口的实现</h1>

接口是用来定义行为的类型。这些被定义的行为不由接口直接实现,而是通过方法由用户定义的类型实现。如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定义的类型的值就可以赋给这个接口类型的值。这个赋值会把用户定义的类型的值存入接口类型的值。

对接口值方法的调用会执行接口值里存储的用户定义的类型的值对应的方法。因为任何用户定义的类型都可以实现任何接口,所以对接口值方法的调用自然就是一种多态。在这个关系里,用户定义的类型通常叫作实体类型,原因是如果离开内部存储的用户定义的类型的值的实现,接口值并没有具体的行为。

并不是所有值都完全等同,用户定义的类型的值或者指针要满足接口的实现,需要遵守方法集的一些规则。探寻方法集的细节之前,了解接口类型值大概的形式以及用户定义的类型的值是如何存入接口的,会有很多帮助。

下图展示了在user 类型值赋值后接口变量的值的内部布局。接口值是一个两个字长度的数据结构,第一个字包含一个指向内部表的指针。这个内部表叫作iTable,包含了所存储的值的类型信息。iTable 包含了已存储的值的类型信息以及与这个值相关联的一组方法。第二个字是一个指向所存储值的指针。将类型信息和指针组合在一起,就将这两个值组成了一种特殊的关系。

下图展示了一个指针赋值给接口之后发生的变化。在这种情况里,类型信息会存储一个指
向保存的类型的指针,而接口值第二个字依旧保存指向实体值的指针。

到此这篇关于“Go语言接口(interface)的实现原理”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
基于类型系统的面向对象编程语言Go
想系统学习GO语言(Golang
关于golang面向接口
Go 之 interface接口理解
Go语言基础之接口(面向对象编程下)
Go语言空接口类型(interface{})
浅析Go语言的Interface机制
Go语言interface详解
Go语言学习(十五)面向对象编程-接口
go语言学习-接口赋值的两种类型

[关闭]
~ ~