接口特性
(1)接口是一个或多个方法签名的集合
(2)只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,称为Structural Typing
(3)接口只有方法声明没有实现,没有数据字段
接口实现的例子
package main
import "fmt"
type USB interface{
Name() string
Connect()
}
type PhoneConnector struct{
name string
}
func (pc PhoneConnector )Name()string{
return pc.name
}
func (pc PhoneConnector )Connect(){
fmt.Println("Connect:",pc.name)
}
func Disconnect(usb USB){
fmt.Println("Disconnected")
}
func main(){
a:=PhoneConnector{"PhoneConnector"}//PhoneConnector achieves the USB so we can let
//a=PhoneConnector
a.Connect()
Disconnect(a)
}
嵌入接口
package main
import "fmt"
type USB interface{
Name() string
Connector //Connect()
}
type Connector interface{
Connect()
}
type PhoneConnector struct{
name string
}
func (pc PhoneConnector )Name()string{
return pc.name
}
func (pc PhoneConnector )Connect(){
fmt.Println("Connect:",pc.name)
}
func Disconnect(usb USB){
if pc,ok:=usb.(PhoneConnector);ok{
fmt.Println("Disconnected",pc.name)
return
}
fmt.Println("unknown device")
}
func main(){
a:=PhoneConnector{"PhoneConnector"}//PhoneConnector achieves the USB so we can let
//a=PhoneConnector
a.Connect()
Disconnect(a)
}
上帝接口(任何类型都实现了该接口)
package main
import "fmt"
type empty interface{
}
type USB interface{
Name() string
Connector //Connect()
}
type Connector interface{
Connect()
}
type PhoneConnector struct{
name string
}
func (pc PhoneConnector )Name()string{
return pc.name
}
func (pc PhoneConnector )Connect(){
fmt.Println("Connect:",pc.name)
}
func Disconnect(usb empty){//you can give any type
switch v:=usb.(type){
case PhoneConnector:
fmt.Println("Disconnected",v.name)
default:
fmt.Println("unknown device")
}
}
func main(){
a:=PhoneConnector{"PhoneConnector"}//PhoneConnector achieves the USB so we can let
//a=PhoneConnector
a.Connect()
Disconnect(a)
}
空接口允许传递任何类型
接口转换
以上述为例子:
Connector不能转换为USB但是USB可以转换为Connector
package main
import "fmt"
type empty interface{
}
type USB interface{
Name() string
Connector //Connect()
}
type Connector interface{
Connect()
}
type PhoneConnector struct{
name string
}
func (pc PhoneConnector )Name()string{
return pc.name
}
func (pc PhoneConnector )Connect(){
fmt.Println("Connect:",pc.name)
}
func Disconnect(usb empty){//you can give any type
switch v:=usb.(type){
case PhoneConnector:
fmt.Println("Disconnected",v.name)
default:
fmt.Println("unknown device")
}
}
func main(){
pc:=PhoneConnector{"PhoneConnector"}
var a Connector
a=Connector(pc)//translate the PhoneConnector to Connector
a.Connect()
}