Go接口几连问
Go的接口与C++的接口有何异同
- 具体表现上,C++的接口定义方式是“侵入式”的,也就是显式声明;而Go则是非侵入式的,由编译器自动识别。
- 底层实现上,C++通过 虚函数表 实现 基类 调用 派生类 的函数;Go通过 itab 中的 fun字段实现接口变量调用实体类型的函数
刚刚讲到了itab,为什么func数组大小为1?如果接口定义了多个方法怎么办?
这里存储的是方法的函数指针。
了解iface和efece吗?它们有什么区别?
都是Go中描述接口的底层结构体。
区别在于:iface(interface)描述的接口包含方法,eface(emptyface)的不包括。
接口转换的原理是什么?(前提:类型兼容)
- 接口转接口:itab调用getitab函数,只生成一次,之后直接从itab哈希表中获取。
- 具体类型转空接口时:复制原类型的_type字段,申请一块新内存,把值存进去,data指向新内存。
- 具体类型转非空接口:malloc部分同上,入参tab在编译阶段已生成,新接口的tab字段指向入参tab指向的itab
类似var _io.Write=(*myWriter)(nil)这样的用法是什么意思?
编译器会由此检查*myWriter类型是否实现了io.Writer接口