面试题答案
一键面试-
空接口的数据结构设计原理
- 在Go语言中,空接口
interface{}
本身不包含任何方法声明,所以它的数据结构非常简洁。 - 空接口底层的数据结构实际上是一个
iface
结构体(在Go源码src/runtime/runtime2.go
中定义),其简化版结构如下:
type iface struct { tab *itab data unsafe.Pointer }
tab
是指向itab
结构体的指针,itab
结构体存储了接口的类型信息以及实现该接口的具体类型的信息,包括类型描述符和方法集等。data
是一个指向实际存储数据的指针,该数据就是赋给空接口的值。
- 在Go语言中,空接口
-
类型信息的保存与获取
- 保存:
- 当向空接口存储一个具体类型值时,Go编译器会在编译期确定具体类型,并生成相应的代码来创建
itab
结构体。 itab
结构体中包含了指向具体类型type
结构体的指针,type
结构体描述了具体类型的详细信息,如类型大小、对齐方式、方法集等。同时,itab
也包含了接口方法集与具体类型方法集的映射关系。- 例如,当
var i interface{} = 10
时,编译器会创建一个itab
结构体,其中type
指针指向int
类型的描述符,data
指针指向值10
。
- 当向空接口存储一个具体类型值时,Go编译器会在编译期确定具体类型,并生成相应的代码来创建
- 获取:
- 在运行时,当需要从空接口获取类型信息时,通过
iface
结构体中的tab
指针找到对应的itab
结构体。 - 从
itab
结构体中取出指向具体类型type
结构体的指针,就可以获取到具体类型的所有信息。例如,可以通过type
结构体获取类型名称、大小等信息。 - 在进行类型断言(如
val, ok := i.(int)
)时,Go运行时会检查itab
结构体中的类型信息,判断接口值的实际类型是否与断言的类型一致,从而确定断言是否成功。如果一致,则可以安全地将空接口值转换为指定类型。
- 在运行时,当需要从空接口获取类型信息时,通过
- 保存: