如果你有一堆方法,那么interface就是你的好朋友,哪怕你是一只猫,也要学会鸭子叫。
01 接口是什么?从一场动物秀说起
想象一下,你正在组织一场动物秀,要求所有参与者都必须会叫和会走。你不关心它是什么动物,只关心它能不能完成这些动作。
在Go语言中,interface(接口)就是这样的一个契约,它定义了一组方法签名,但不包含具体的实现。只要某个类型实现了这些方法,我们就说它实现了这个接口。
type Animal interface {
Speak() string
Move() string
}
type Dog struct {
Name string
}
func (d Dog) Speak() string {
return "Woof!"
}
func (d Dog) Move() string {
return "Running on four legs"
}
type Bird struct {
Name string
}
func (b Bird) Speak() string {
return "Chirp!"
}
func (b Bird) Move() string {
return "Flying in the sky"
}
在上面这段代码中,我们定义了一个Animal接口,然后让Dog和Bird类型分别实现了这个接口。这就是Go语言接口的核心思想:只要像鸭子,那就是鸭子。
Go语言的这种接口隐式实现方式允许在具体类型已经存在的情况下再去定义接口,这样也不会破坏原来的定义。
02 接口的三种神奇用法
① 作为函数参数,实现多态
接口可以作为函数参数,让函数接受不同类型的参数,只要这些类型实现了相同的接口。
func PerformShow(a Animal) {
fmt.Printf("The animal says: %s\n", a.Speak())
fmt.Printf("And it moves by: %s\n", a.Move())
}
func main() {
dog := Dog{Name: "Buddy"}
bird := Bird{Name: "Tweety"}
PerformShow(dog) // 输出:The animal says: Woof! And it moves by: Running on four legs
PerformShow(bird) // 输出:The animal says: Chirp! And it moves by: Flying in the sky
}
这种多态的特性让代码更加灵活和可扩展。你可以轻松添加新的动物类型,而不需要修改PerformShow函数。
② 作为返回值,隐藏实现细节
接口也可以作为函数的返回值,这样你可以隐藏具体的实现细节,只暴露必要的接口方法。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



