接口interface

目的

通过接口实现一个通用的数据连接驱动器。定义一个DB接口,包含一个基本的Connect方法。任何连接数据驱动,必须实现该接口。

接口定义

接口是一种约束形式,其中只包括成员定义,不包含成员实现的内容。主要目的是为不相关的类提供通用的处理服务。Golang中,一个类型可以同时实现多个接口。但每一个接口中的方法必须全部实现,否则实现接口失败。

DB interface
    |
  __|__
\|/   \|/
MYSQL  MSSQL

接口类型

  • 空接口类型

接口实现

声明Mysql与Mssql两种类型,两种类型均实现了Dbinter接口。

// 定义接口
type DBinter interface {
	connect(dns string) (result DBinter, err error)
}

// 实现接口
type Mysql struct {
}

func (db *Mysql) connect(dns string) (result DBinter, err error) {
	fmt.Println("Connect MySQL success!")
	return db, nil
}

// 实现接口
type Mssql struct {
}

func (db *Mssql) connect(dns string) (result DBinter, err error) {
	fmt.Println("Connect MSSQL success!")
	return db, nil
}
// 定义应用层操作类型
type DB struct {
	driver map[string]DBinter
}
// 注册
func (db *DB) register(name string, driver DBinter) {
	if db.driver == nil {
		db.driver = make(map[string]DBinter)
	}
	if _, err := db.driver[name]; !err {
		db.driver[name] = driver
	}
}
// 获取
func (db *DB) instance(name string) (driver DBinter, err error) {
	if driver, err := db.driver[name]; err {
		return driver,nil
	}
	return nil,err
}

func main() {
	var db DB
	var mysql Mysql
	var mssql Mssql

	db.register("mysql", &mysql)
	db.register("mssql", &mssql)

	mysqlDb,_ := db.instance("mysql")
	mysqlDb.connect("127.0.0.1")
	mssqlDb,_ := db.instance("mysql")
	mssqlDb.connect("127.0.0.1")
}

函数接口

  1. 函数接口不能直接实列化,只能将其它函数转化为自己的类型 // 函数定义为类型 type FuncCaller func(interface{}) // 实现Invoker的Call func (f FuncCaller) Call(p interface{}) { // 调用f函数本体 f(p) } func main() { fu := FuncCaller(func(v interface{}) { fmt.Println("from function", v) }) fu.Call("test") }

2.

type Cart struct{
  Window string
  Safe   int
}

type ContextOption func(c *Cart) error

func WithWindow(window string) ContextOption {
	return func(c *Cart) error {
		c.Window = window
		return nil
	}
}

func WithSafe(safe string) ContextOption {
	return func(c *Cart) error {
		o.Safe = safe
		return nil
	}
}