面试题答案
一键面试代码实现
package main
import (
"fmt"
)
// 定义接口
type MyInterface interface {
DoSomething() string
}
// 定义具体类型
type MyType struct {
value int
}
func (m MyType) DoSomething() string {
return fmt.Sprintf("MyType with value %d", m.value)
}
// 定义函数,接收接口切片并进行类型断言和方法调用
func processSlice(slice []MyInterface) {
for _, item := range slice {
if myVal, ok := item.(MyType); ok {
fmt.Println(myVal.DoSomething())
}
}
}
Go接口内部数据结构对类型断言的支持
在Go语言中,接口内部数据结构由两个部分组成:itab
(接口表)和具体数据。
- itab:
itab
包含了接口的类型信息以及实现该接口的具体类型信息。当进行类型断言x.(T)
时,运行时系统会检查x
的动态类型是否与T
一致。这个检查过程就是在itab
中完成的,itab
存储了接口类型和具体类型的元数据,使得运行时可以快速判断断言是否成功。 - 具体数据:接口变量在存储具体值时,会存储具体值的副本(对于指针类型则存储指针)。当类型断言成功后,就可以直接从接口变量存储的具体数据部分获取到
T
类型的值,并调用其特有的方法。
这样,通过接口内部的 itab
和具体数据的存储方式,Go语言支持了高效的类型断言操作。