Golang怎么面试常问interface底层_Golang如何回答iface和eface区别的面试题【指南】
iface和eface内存布局不同:eface含_type和data,无方法;iface含tab(指向itab)和data,itab存方法表、类型指针等。iface 和 eface 到底长什么样?先看内存布局Go 的 interface{}(空接口)和非空接口(比如 io.Reader)在底层是两个完全不同的结构体:eface 和 iface。面试官问区别,本质是在考你有没有看过 runtime 源码里的定义。eface 只有两个字段:_type(指向类型元信息)和 data(指向值本身),不存任何方法——因为它不需要调用方法iface 也是两个字段:tab(指向 itab 结构)和 data;而 itab 里才真正存了接口方法表(fun[1]uintptr)、类型指针、哈希值等所以空接口能装一切,但没法直接调方法;非空接口必须满足方法集,否则编译就报错:does not implement ...为什么 var p io.Reader = &bytes.Buffer{} 能过,而 = bytes.Buffer{} 有时不行?这和 iface 的 itab 构建时机强相关:接口赋值时,运行时要查「具体类型是否实现了接口的所有方法」,而方法集匹配取决于接收者类型(值 or 指针)。如果方法定义在 *T 上,那只有 &t 能赋给接口;t 会失败如果方法定义在 T 上,那 t 和 &t 都可以(Go 会自动取地址或解引用)常见错误现象:cannot use xxx literal (type Y) as type Z in assignment: Y does not implement Z (Method has pointer receiver)实操建议:定义接口实现时,优先统一用指针接收者,避免值类型意外无法赋值interface{} 类型转换 panic 的真实原因是什么?不是“类型不对”就 panic,而是 eface 的 _type 字段和断言目标类型不匹配时,运行时找不到可执行的类型转换路径。 文心快码 文心快码(Comate)是百度推出的一款AI辅助编程工具
更多推荐

所有评论(0)