go的多态只能用接口来实现,不能用嵌入结构体的继承方式来实现。
go的多态和java很像,结合下面代码中的例子很容易就能理解。
在下面代码中,我们定义了一个接口DatabaseConnection,代表着数据库连接。这个接口有三个具体实现:MysqlConnection 、SqlServerConnection 、OracleConnection,代表着三种不同的数据库连接。
我们创建一个工厂,工厂中的方法功能是创建一个数据库连接,根据传入参数的不同,工厂方法返回三种数据库连接其中的某一个。
因为工厂方法声明的返回值类型是接口DatabaseConnection,而其真实的返回值是三种具体实现该接口的结构体的某一种,所以这里就体现了go对多态的支持。
go
package main
import (
"errors"
"fmt"
"strings"
)
// 接口
type DatabaseConnection interface {
doConnect()
execSql()
}
// 接口的具体实现1
type MysqlConnection struct {
}
func (MysqlConnection) doConnect() {
fmt.Println("Mysql数据库连接")
}
func (MysqlConnection) execSql() {
fmt.Println("Mysql执行sql语句")
}
// 接口的具体实现2
type SqlServerConnection struct {
}
func (SqlServerConnection) doConnect() {
fmt.Println("SqlServer数据库连接")
}
func (SqlServerConnection) execSql() {
fmt.Println("SqlServer执行sql语句")
}
// 接口的具体实现3
type OracleConnection struct {
}
func (OracleConnection) doConnect() {
fmt.Println("Oracle数据库连接")
}
func (OracleConnection) execSql() {
fmt.Println("Oracle执行sql语句")
}
// 工厂
type DatabaseConnectionFactory struct {
}
// 工厂方法,参数name为需要创建的数据库连接的类型,比如mysql,oracle等等
func (DatabaseConnectionFactory) CreateDatabase(name string) (DatabaseConnection, error) {
switch strings.ToLower(name) {
case "mysql":
return &MysqlConnection{}, nil
case "oracle":
return &OracleConnection{}, nil
case "sqlserver":
return &SqlServerConnection{}, nil
}
return nil, errors.New("no such database: " + name)
}
func main() {
var name string
fmt.Scan(&name) //从控制台输入想要创建的数据库类型,如mysql,oracle等等
factory := DatabaseConnectionFactory{}
if dc, err := factory.CreateDatabase(name); err == nil {
dc.doConnect()
dc.execSql()
} else {
fmt.Print(err.Error())
}
}