“鸭子”接口
package main
import "fmt"
// go这种动态语言认为属性不重要,但方法很重要,只要实现了接口
// 那它就是鸭子类型
// 定义鸭子接口
type Duck interface {
// 存放方法的声明
swimming()
flying()
walking()
}
// 定义鸭子结构体
type DuckInstance struct {
legs int
weight int
}
// 鸭子结构体实现鸭子接口
// 即使不用指针类型的参数,也能调用
func (di *DuckInstance) swimming() {
fmt.Println("swimming like a duck")
}
func (di *DuckInstance) flying() {
fmt.Println("flying like a duck")
}
func (di *DuckInstance) walking() {
fmt.Println("walking like a duck")
}
func main() {
// 鸭子类型:go语言中处处都是interface,所以到处都是鸭子类型
/*
当看到一只鸟,走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那么这只鸟就是鸭子
也就是说,某个类是不是“鸭子”,要看它的方法能不能像鸭子一样工作
go语言认为属性不重要,方法才是区分结构体是否是接口的关键
鸭子类型强调的是事物的外部行为特征,而不是内部的结构属性
*/
// var di Duck = &DuckInstance{}
// 虽然上面这种声明方式也可以,但还是养成用new声明的习惯
// 而且即使不用指针类型的参数,也能调用,也就是说
/*
var di Duck = DuckInstance{}
di.swimming()
di.flying()
di.walking()
这样也是能够调用成功的
但是,swimming()、flying()和walking()方法必须都实现,才能用“子类”DuckInstance实例化
*/
// 这里 new(DuckInstance) 等价于 &DuckInstance{},但推荐使用 new(DuckInstance) 方式
var di Duck = new(DuckInstance)
di.swimming()
di.flying()
di.walking()
}
原创大约 5 分钟