面试题答案
一键面试- 常见使用场景
- 根据不同类型执行不同逻辑:当一个接口可能持有多种不同类型的值,需要针对不同类型执行特定的业务逻辑时,可以使用类型断言。例如,在图形绘制系统中,一个
Shape
接口可能由Circle
和Rectangle
等不同类型实现,通过类型断言可以针对不同的图形类型进行不同的绘制逻辑。 - 访问具体类型特有的方法或属性:如果具体类型除了实现接口方法外,还有一些特有的方法或属性,在已知接口实际类型的情况下,通过类型断言获取具体类型后可以访问这些特有的内容。
- 根据不同类型执行不同逻辑:当一个接口可能持有多种不同类型的值,需要针对不同类型执行特定的业务逻辑时,可以使用类型断言。例如,在图形绘制系统中,一个
- 类型断言转换及处理失败情况示例
package main
import (
"fmt"
)
// 定义一个接口
type Animal interface {
Speak() string
}
// 定义Dog结构体并实现Animal接口
type Dog struct {
Name string
}
func (d Dog) Speak() string {
return fmt.Sprintf("Woof! My name is %s", d.Name)
}
// 定义Cat结构体并实现Animal接口
type Cat struct {
Name string
}
func (c Cat) Speak() string {
return fmt.Sprintf("Meow! My name is %s", c.Name)
}
func main() {
var a Animal
a = Dog{Name: "Buddy"}
// 类型断言转换为Dog类型
if dog, ok := a.(Dog); ok {
fmt.Println("It's a dog:", dog.Speak())
} else {
fmt.Println("It's not a dog")
}
// 尝试转换为Cat类型
if cat, ok := a.(Cat); ok {
fmt.Println("It's a cat:", cat.Speak())
} else {
fmt.Println("It's not a cat")
}
}
在上述代码中,首先定义了Animal
接口以及Dog
和Cat
结构体并实现了该接口。在main
函数中,通过a.(Dog)
这样的类型断言尝试将接口值a
转换为Dog
类型,并通过ok
判断转换是否成功。如果成功,就可以访问Dog
类型特有的属性和方法。同样的方式也用于尝试将a
转换为Cat
类型并处理转换失败的情况。