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() {
// 创建一个包含不同实现Animal接口实例的切片
animals := []Animal{
Dog{Name: "Buddy"},
Cat{Name: "Whiskers"},
}
// 遍历切片并根据实际类型执行不同操作
for _, animal := range animals {
switch v := animal.(type) {
case Dog:
fmt.Println("This is a dog:", v.Speak())
case Cat:
fmt.Println("This is a cat:", v.Speak())
default:
fmt.Println("Unknown animal type")
}
}
}
实际项目中的意义
- 代码复用:通过接口,不同类型的对象可以统一管理和处理,减少重复代码。例如在一个宠物管理系统中,无论是狗还是猫都实现了
Animal
接口,在遍历所有宠物并让它们“说话”时,可以统一操作。
- 扩展性:如果后续新增一种动物(如
Bird
)并实现Animal
接口,只需要添加新的类型判断逻辑,而不需要修改原有代码的整体结构。例如,当需要处理鸟叫时,只需在switch
语句中添加case Bird
的分支。
- 灵活性:不同类型的实例在同一接口切片中,使得系统可以根据实际情况动态处理不同类型的数据。在游戏开发中,不同类型的游戏角色(如战士、法师等)都实现了
Character
接口,在遍历角色列表进行不同行为(如攻击、防御)处理时,可以根据实际类型灵活执行不同操作。