什么是多型
对于「多型 Polymorphism」的概念理解像是「要做一件事,但这件事对不同对象来说实践的方式不同」。具体来说像是各种「形状」都可以「算面积」,但背后实践的方法却不同,而在 Go 当中 interface 就是类型用于定义方法的集合。
有了多型可以让程序扩充时轻松扩张,又对修改封闭。
// Beforefunc getArea() {    if t == "circle" {        // 算圆面积    } else if t == "rectangle" {        // 算矩形面积    }}
// Aftertype geometry interface {    area() float64}Go 与多型
如下案例透过 Go interface 隐性的创造 interface,只要某个类型具备接口要求的方法集合,就「自动」符合该 interface。
// 1. 圆形和矩形type rect struct {    width, height float64}type circle struct {    radius float64}
// 2. 定义「形状」的合约定义上要有的方法(算面积)type geometry interface {    area() float64}
// 3. 测量方法必须接收「形状」func measure(g geometry) {    fmt.Println(g.area())}
// 4. 实践矩形圆形计算面积方法func (r rect) area() float64 {    return r.width * r.height}
func (c circle) area() float64 {    return math.Pi * c.radius * c.radius}
func main() {    r := rect{width: 3, height: 4}    c := circle{radius: 5}    measure(r)    measure(c)}Interface Composition
也可以通过嵌套 interface 达成 composition 的目的。
package main
import (  "fmt"  "math")
// 1. 定义矩形和圆形type rect struct {  width, height float64}
type circle struct {  radius float64}
// 2. 定义单一责任的接口type areaCalculator interface {  area() float64}
type perimeterCalculator interface {  perimeter() float64}
// 3. 使用 interface composition 组合成更大的接口type geometry interface {  areaCalculator  perimeterCalculator}
// 4. 为矩形和圆形实现func (r rect) area() float64 {  return r.width * r.height}func (r rect) perimeter() float64 {  return 2 * (r.width + r.height)}
func (c circle) area() float64 {  return math.Pi * c.radius * c.radius}func (c circle) perimeter() float64 {  return 2 * math.Pi * c.radius}
// 5. 接收复合接口func measure(g geometry) {  fmt.Printf("Area: %.2f, Perimeter: %.2f\n", g.area(), g.perimeter())}
func main() {  r := rect{width: 3, height: 4}  c := circle{radius: 5}  measure(r)  measure(c)}