转载《Go语言interface底层实现》
interface底层是怎么实现的,由于一直都是浮于水面,未去深究过,这里也是去查了些资料了解,这篇博客把interface结构解构的很清楚了,我觉得,博主画的那几幅图就能很好的进行理解了。
简述
eface的具体结构是:

eface的整体结构是:

iface的具体结构是:

itab是iface不同于eface比较关键的数据结构。其可包含两部分:一部分是确定唯一的包含方法的interface的具体结构类型,一部分是指向具体方法集的指针。
具体结构为:

概述
Go的interface源码在Golang源码的runtime目录中。
Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。
Go的interface是由两种类型来实现的:iface和eface。
其中,iface表示的是包含方法的interface,例如:
1 | type Person interface { |
而eface代表的是不包含方法的interface,即
1 | type Person interface {} |
或者
1 | var person interface{} = xxxx实体 |
eface
eface的具体结构是:

一共有两个属性构成,一个是类型信息_type,一个是数据信息。
其中,_type可以认为是Go语言中所有类型的公共描述,Go语言中几乎所有的数据结构都可以抽象成_type,是所有类型的表现,可以说是万能类型,
data是指向具体数据的指针。
type的具体代码为:
1 | type _type struct { |
eface的整体结构是:

对于没有方法的interface赋值后的内部结构是怎样的呢?
可以先看段代码:
1 | import ( |
输出200,赋值后的结构图是这样的:

对于将不同类型转化成type万能结构的方法,是运行时的convT2E方法,在runtime包中。
以上,是对于没有方法的接口说明。
对于包含方法的函数,用到的是另外的一种结构,叫iface
iface
所有包含方法的接口,都会使用iface结构。包含方法的接口就是一下这种最常见,最普通的接口:
1 | type Person interface { |
iface的源代码是:
1 | type iface struct { |
iface的具体结构是:

itab是iface不同于eface比较关键的数据结构。其可包含两部分:一部分是确定唯一的包含方法的interface的具体结构类型,一部分是指向具体方法集的指针。
具体结构为:

属性 itab的源代码是:
1 | type itab struct { |
属性interfacetype类似于_type,其作用就是interface的公共描述,类似的还有maptype、arraytype、chantype…其都是各个结构的公共描述,可以理解为一种外在的表现信息。interfacetype源码如下:
1 | type interfacetype struct { |
iface的整体结构为:

对于含有方法的interface赋值后的内部结构是怎样的呢?
一下代码运行后
1 | package main |
首先,要知道代码运行结果为:200。
其次,了解到fmt.Stringer是一个包含String方法的接口。
1 | type Stringer interface { |
最后,赋值后接口Stringer的内部结构为:

对于将不同类型转化成itable中type(Binary)的方法,是运行时的convT2I方法,在runtime包中。
参考文献:
《Go in action》
https://research.swtch.com/interfaces
https://juejin.im/entry/5a7d08d3f265da4e865a6200
本文标题:转载《Go语言interface底层实现》
文章作者:小师
发布时间:2019-06-19
最后更新:2022-05-04
原始链接:chunlife.top/2019/06/19/转载《Go语言interface底层实现》/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可