鸭子类型

在鸭子类型中,关注点在于对象的行为(func),能作什么;而不是关注对象所属的类型(type)。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import "fmt"

var drivers = make(map[string]Driver)

type Driver interface {
Open(name string)
}

type DriverContext interface {
OpenConnector()
}

type MySQLDriver struct{}

func (d MySQLDriver) Open(name string) {
driveri := drivers[name]
// MySQLDriver 实现了 Driver 的所有方法(Open),所以这里可以类型断言
if driverCtx, ok := driveri.(DriverContext); ok {
fmt.Printf("%T\n", driverCtx)
}
}
func (d MySQLDriver) OpenConnector() {}

func Register(name string, d Driver) {
fmt.Printf("%T\n", d) // main.MySQLDriver
drivers[name] = d // MySQLDriver 实现了 Driver 的所有方法(Open),所以这里可以赋值
}
func main() {
var d MySQLDriver
Register("mysql", d) // MySQLDriver 实现了 Driver 的所有方法(Open),所以这里可以传参
}