实例具有多种形态。面向对象的三大特性,在GO语言中,多态的特征通过接口实现的,可以按照统一的接口来调用不同的实现,这时接口变量就是不同的形态.
package main import ( "fmt" ) type Usb interface { Start() Stop() } type Phone struct { } // 让Phone实现Usb接口方法 func (phone Phone) Start() { fmt.Println("手机开始工作...") } func (phone Phone) Stop() { fmt.Println("手机停止工作...") } type Camera struct { } // 让Camera实现Usb接口方法 func (camera Camera) Start() { fmt.Println("相机开始工作...") } func (camera Camera) Stop() { fmt.Println("相机停止工作...") } type Computer struct { } // 编写一个方法Working方法,接收一个Usb接口类型变量 // 只要是实现了Usb接口,(所谓实现Usb接口,就是指实现了Usb接口声明所有方法) func (computer Computer) Working(usb Usb) { // usb变量会根据传入的实参,来判断到底是Phone还是Camera // 通过usb接口变量来调用Start和Stop方法 usb.Start() usb.Stop() } func main() { computer := Computer{} phone := Phone{} computer.Working(phone) camera := Camera{} computer.Working(camera) }
输出结果:
手机开始工作... 手机停止工作... 相机开始工作... 相机停止工作...
多态参数
在前面的Usb接口案例,Usb usb,即可以接收手机变量,又可以接收相机变量,就实现了Usb接口多态
多态数组
package main import ( "fmt" ) type Usb interface { Start() Stop() } type Phone struct { Name string } // 让Phone实现Usb接口方法 func (phone Phone) Start() { fmt.Println("手机开始工作...") } func (phone Phone) Stop() { fmt.Println("手机停止工作...") } func (phone Phone) Call() { fmt.Println("手机可以打电话...") } type Camera struct { Name string } // 让Camera实现Usb接口方法 func (camera Camera) Start() { fmt.Println("相机开始工作...") } func (camera Camera) Stop() { fmt.Println("相机停止工作...") } func main() { var usbArr [3]Usb usbArr[0] = Phone{"小米"} usbArr[1] = Phone{"vivo"} usbArr[2] = Camera{"尼康"} for _, v := range usbArr { v.Start() v.Stop() if phone, ok := v.(Phone); ok { phone.Call() } } }
输出结果:
手机开始工作... 手机停止工作... 手机可以打电话... 手机开始工作... 手机停止工作... 手机可以打电话... 相机开始工作... 相机停止工作...