Go语言interface底层实现

Go的interface源码在Golang源码的runtime目录中。Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。Go的interface是由两种类型来实现的:iface和eface。

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

对于没有方法的interface赋值后的内部结构是怎样的呢?可以先看段代码:import("fmt""strconv")typeBinaryuint64funcmain())(b)fmt.Println(any)}输出200,赋值后的结构图是这样的:

对于将不同类型转化成type万能结构的方法,是运行时的convT2E方法,在runtime包中。以上,是对于没有方法的接口说明。对于包含方法的函数,用到的是另外的一种结构,叫ifaceiface所有包含方法的接口,都会使用iface结构。

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

Go语言interface底层实现

对于含有方法的interface赋值后的内部结构是怎样的呢?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181009A03LRL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券