多态是指代码可以根据类型的具体实现采取不同行为的能力

基本介绍

变量(实例)具有多种形态,多态是通过接口实现的,可以按照统一的接口来调用不同的实现,这时,接口变量就呈现出不同的形态
举例:Usb接口例子中,(usb Usb),既可以接收手机变量,又可以接收相机变量,体现出 Usb 接口的多态特性。

  1. // 代码片段:
  2. // 编写 Working 方法,接收一个 Usb 接口类型的变量,
  3. // 只要一个类型实现了某个接口,那么所有使用这个接口的地方,都支持这种类型的值
  4. // (比如: 实参 phone, camera, 都是 Usb 类型来接收, 这就是多态)
  5. // 多态参数
  6. func (computer *Computer) Working(usb Usb) {
  7. usb.start()
  8. usb.stop()
  9. }
  10. func main() {
  11. computer := Computer{}
  12. phone := Phone{"手机"}
  13. camera := Camera{"相机"}
  14. computer.Working(phone) // 值接收者
  15. computer.Working(&camera) // 指针接收者
  16. }

接口体现多态特征

多态参数,多态数组
image.png
调用实体类型的特有方法(Phone.call())——类型断言

多态数组

  1. // 该案例展示 多态数组
  2. package main
  3. import (
  4. "fmt"
  5. )
  6. // 定义 Usb 接口, 有两个方法(行为)
  7. type Usb interface {
  8. start()
  9. stop()
  10. }
  11. // 定义 Phone 结构体, 并实现 start, stop 方法
  12. type Phone struct {
  13. Name string
  14. }
  15. // 值接收者
  16. // Phone 类型实现了 Usb 接口 (就是实现了 Usb 接口的所有方法)
  17. func (phone Phone) start() {
  18. fmt.Printf("%v开始--- \n", phone.Name)
  19. }
  20. func (phone Phone) stop() {
  21. fmt.Printf("%v停止--- \n", phone.Name)
  22. }
  23. // 定义 Camera 结构体, 并实现 start, stop 方法
  24. type Camera struct {
  25. Name string
  26. }
  27. // 指针接收者
  28. // Camera 指针类型实现了 Usb 接口 (就是实现了 Usb 接口的所有方法)
  29. func (camera *Camera) start() {
  30. fmt.Printf("%v开始--- \n", camera.Name)
  31. }
  32. func (camera *Camera) stop() {
  33. fmt.Printf("%v停止--- \n", camera.Name)
  34. }
  35. // 定义 Computer 结构体, 并实现 Working 方法
  36. type Computer struct {
  37. }
  38. // 编写 Working 方法,接收一个 Usb 接口类型的变量,
  39. // 只要一个类型实现了某个接口,那么所有使用这个接口的地方,都支持这种类型的值
  40. // (比如: 实参 phone, camera, 都是 Usb 类型来接收, 这就是多态)
  41. func (computer *Computer) Working(usb Usb) {
  42. usb.start()
  43. usb.stop()
  44. }
  45. func main() {
  46. // 定义 Usb 接口数组
  47. var usbArr [3]Usb
  48. fmt.Println("usbArr = ", usbArr) // [<nil> <nil> <nil>]
  49. /*
  50. 以下,接口类型的数组,存放了不同类型的元素(Phone, Camera...)
  51. 这里就体现了多态数组
  52. */
  53. usbArr[0] = Phone{"华为"}
  54. usbArr[1] = &Camera{"尼康"} // *Camera 实现了 Usb 接口
  55. usbArr[2] = Phone{"苹果"}
  56. fmt.Println("usbArr = ", usbArr) // [{华为} 0xc00004c240 {苹果}]
  57. }