Go接口背后的 idea 是duck typing.这很简单地解释为:如果你看起来像一只鸭子,叫起来像一只鸭子,那么你就是一只鸭子.这意味着,如果您的对象实现了所有的鸭子特性,那么将其用作鸭子应该是没有问题的.下面是一个示例:
package main
import (
"fmt"
)
type Walker interface {
Walk() string
}
type Human string
type Dog string
func (human Human) Walk() string { //A human is a walker
return "I'm a man and I walked!"
}
func (dog Dog) Walk() string { //A dog is a walker
return "I'm a dog and I walked!"
}
//Make a walker walk
func MakeWalk(w Walker) {
fmt.Println(w.Walk())
}
func main() {
var human Human
var dog Dog
MakeWalk(human)
MakeWalk(dog)
}
这里Human
是Walker
,Dog
是Walker
.为什么?因为他们都...嗯...Walk
.它们都实现了Walk () string
功能.这就是为什么你可以在它们上执行MakeWalk
.
当您希望不同类型的人以相同的方式行事时,这非常有用.一个实际的例子是文件类型的对象(套接字、文件对象)——所有这些对象都需要一个写函数和一个读函数.然后你可以用同样的方式写和读,而不依赖于它们的类型——这很酷.