Ale*_*aru 39
go接口背后的想法是鸭子打字.这简单地转化为:如果你看起来像鸭子和庸医像鸭子那么你就是一只鸭子.这意味着如果你的对象实现了所有duck的功能,那么使用它作为duck就没有问题.这是一个例子:
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)
}
Run Code Online (Sandbox Code Playgroud)
这里a Human是a Walker,a Dog是a Walker.为什么?因为他们都..嗯... Walk.他们都实现了这个Walk () string功能.所以这就是你可以执行MakeWalk它们的原因.
当您希望不同类型以相同方式运行时,这非常有用.一个实际的例子是文件类型对象(套接字,文件对象) - 你需要一个Write和Read函数.然后你可以使用独立于其类型的相同方式使用Write和Read - 这很酷.