面试题答案
一键面试package main
import (
"fmt"
)
// 定义不同的结构体
type StructA struct{}
func (a StructA) MethodA() {
fmt.Println("StructA's MethodA")
}
type StructB struct{}
func (b StructB) MethodB() {
fmt.Println("StructB's MethodB")
}
func main() {
var interfaceSlice []interface{}
interfaceSlice = append(interfaceSlice, StructA{})
interfaceSlice = append(interfaceSlice, StructB{})
for _, item := range interfaceSlice {
if a, ok := item.(StructA); ok {
a.MethodA()
} else if b, ok := item.(StructB); ok {
b.MethodB()
} else {
fmt.Println("Type assertion failed")
}
}
}
在上述代码中:
- 首先定义了两个不同的结构体
StructA
和StructB
,并分别为它们定义了各自特有的方法MethodA
和MethodB
。 - 创建了一个空接口类型的切片
interfaceSlice
,并向其中添加了StructA
和StructB
的实例。 - 通过
for
循环遍历这个切片,使用类型断言来判断每个元素的实际类型。如果类型断言成功,就调用对应的方法;如果失败,就打印出 "Type assertion failed"。
上述代码使用 Go 语言编写,因为 Go 语言有简洁的类型断言语法且在处理接口类型切片时非常方便。不同编程语言实现方式会有所不同,但核心思路类似,都是通过类型判断来调用相应结构体的独特方法并处理类型不匹配的情况。