这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记 go语言的接口一直不是很会,看了一篇博客讲的比较清楚
接口就是一系列方法的集合(规范行为)
在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为,规范子类对象的行为。
在 Go 语言中的接口是非侵入式接口(接口没了,不影响代码),侵入式接口(接口没了,子类报错)
Go 也是鸭子类型,比如我现在有个鸭子类,内有 speak 方法和 run 方法,子类只要实现了 speak 和 run,我就认为子类是鸭子,我只要子类中有这两个方法你就是鸭子,有这两个方法你就是鸭子,他是从下往上推导只要有你这里面的东西,那就是算是继承了你这个接口
// Duck 定义一个鸭子接口
type Duck interface {
speak()
run()
}
// WhiteDuck 定义一个白鸭子结构体
type WhiteDuck struct {
name string
age int
sex string
}
// BlackDuck 定义一个黑鸭子结构体
type BlackDuck struct {
name string
age int
sex string
}
// 让白鸭子和黑鸭子绑定接口中的所有方法,就叫实现该接口
// 让白鸭子实现 Duck 接口
func (w WhiteDuck) speak() {
fmt.Println("白鸭子嘎嘎叫,它的名字叫", w.name)
}
func (w WhiteDuck) run() {
fmt.Println("白鸭子慢悠悠的走,它的名字叫", w.name)
}
// 让黑鸭子实现 Duck 接口
func (b BlackDuck) speak() {
fmt.Println("黑鸭子呱呱叫,它的名字叫", b.name)
}
func (b BlackDuck) run() {
fmt.Println("黑鸭子歪歪扭扭的走,它的名字叫", b.name)
}
func main() {
var duck Duck
duck = WhiteDuck{"小白", 15, "男"} // 把我的对象赋值给一个接口类型,就可以实现多态的效果
fmt.Println(duck)
// duck 现在他是一个接口,它只能取方法,不能取出属性了。
duck.speak()
duck.run()
}
输出:
{小白 15 男}
白鸭子嘎嘎叫,它的名字叫 小白
白鸭子慢悠悠的走,它的名字叫 小白