package main
import "fmt"
// 定义接口A
type A interface {
MethodA()
}
// 定义接口B
type B interface {
A
MethodB()
}
// 实现接口A的结构体
type StructA struct{}
func (sa StructA) MethodA() {
fmt.Println("执行 MethodA")
}
// 实现接口B的结构体
type StructB struct {
StructA
}
func (sb StructB) MethodB() {
fmt.Println("执行 MethodB")
}
// 接收interface{}类型参数并进行类型断言和方法调用的函数
func callMethods(i interface{}) {
if b, ok := i.(B); ok {
b.MethodA()
b.MethodB()
} else {
fmt.Println("参数未实现B接口")
}
}
类型断言要点
- 判断类型是否实现接口:在Go语言中,类型断言
i.(B)
用于判断接口值i
是否包含了实现B
接口的具体类型。如果包含,则断言成功,ok
为true
,同时b
为断言成功后的B
接口类型值,可以调用B
接口及其嵌入的A
接口的方法。
- 接口嵌套特性:由于
B
接口嵌套了A
接口,一个类型只要实现了B
接口的所有方法(包括A
接口的方法,因为嵌套意味着继承了A
接口的方法集),就可以被断言为B
接口类型。所以在进行类型断言判断是否实现B
接口时,无需单独判断是否实现A
接口。实现B
接口的类型必然也实现了A
接口,可直接调用A
接口的方法。