鸭子类型

本文最后更新于:2023年12月5日 晚上

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

示例:

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),所以这里可以传参
}

鸭子类型
http://blog.lujinkai.cn/Golang/鸭子类型/
作者
像方便面一样的男子
发布于
2022年1月25日
更新于
2023年12月5日
许可协议