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