知识卡片
接口存两类信息
内容
非空接口运行时包含类型表和数据指针,空接口包含具体类型元数据和数据指针。接口值不只是“一个对象”,而是动态类型与动态值的组合。
参考来源
- 位置:《Go语言底层原理剖析》第12章《接口与程序设计模式》12.5.2节《接口组成》与12.5.7节《空接口组成》
- 结论依据:原文说明带方法签名的接口运行时结构为 iface,"data字段存储了接口中动态类型的函数指针。tab字段存储了接口的类型、接口中的动态数据类型、动态数据类型的函数指针等";而空接口"不需要interfacetype表示接口内在类型,也不需要fun方法列表",使用特殊的 eface 类型,因此可以推出"非空接口存类型表(itab)+数据指针,空接口存具体类型元数据(_type)+数据指针"的结论。
- 原始内容:带方法签名的接口在运行时的具体结构由iface构成,空接口的实现方式有所不同……data字段存储了接口中动态类型的函数指针。tab字段存储了接口的类型、接口中的动态数据类型、动态数据类型的函数指针等……和有方法的接口(iface)相比,空接口不需要interfacetype表示接口的内在类型,也不需要fun方法列表。对于空接口,Go语言在运行时使用了特殊的eface类型,其在64位系统中占据16字节。