接口是一個或多個方法簽名的集合
只要某個類型擁有該接口的所有方法簽名降传,即算實現(xiàn)該接口,無需顯示
聲明實現(xiàn)了哪個接口钠署,這稱為 Structural Typing
接口只有方法聲明,沒有實現(xiàn)谐鼎,沒有數(shù)據(jù)字段
接口可以匿名嵌入其它接口舰蟆,或嵌入到結(jié)構(gòu)中
將對象賦值給接口時,會發(fā)生拷貝狸棍,而接口內(nèi)部存儲的是指向這個
復制品的指針夭苗,既無法修改復制品的狀態(tài),也無法獲取指針
只有當接口存儲的類型和對象都為nil時隔缀,接口才等于nil
接口調(diào)用不會做receiver的自動轉(zhuǎn)換
接口同樣支持匿名字段方法
接口也可實現(xiàn)類似OOP中的多態(tài)
空接口可以作為任何類型數(shù)據(jù)的容器
type USB interface {
Name() string
Connect()
}
type PhoneConnecter struct {
name string
}
func (pc PhoneConnecter) Name() string{
return pc.name
}
func (pc PhoneConnecter) Connect() {
fmt.Println("connect:", pc.name)
}
func Disconnect(usb Usb){
fmt.Println("Disconnected.")
}
func main {
var a USB
a = PhoneConnecter{"PhoneConnecter"}
a.Connect()
}
--end
嵌入接口
type USB interface {
Name() string
Connecter
}
type Connecter interface {
Connect()
}
type PhoneConnecter struct {
name string
}
func (pc PhoneConnecter) Name() string{
return pc.name
}
func (pc PhoneConnecter) Connect() {
fmt.Println("connect:", pc.name)
}
func Disconnect(usb Usb){
if pc, ok := us.(PhoneConnecter); ok {
fmt.Println("Disconnected.", pc.name)
}
fmt.Println("Unknown decive.")
}
func main {
var a USB
a = PhoneConnecter{"PhoneConnecter"}
a.Connect()
}
類型斷言
通過類型斷言的ok pattern可以判斷接口中的數(shù)據(jù)類型
使用type switch則可針對空接口進行比較全面的類型判斷
接口轉(zhuǎn)換
可以將擁有超集的接口轉(zhuǎn)換為子集的接口
延伸閱讀
評: 為什么我不喜歡Go語言式的接口
http://www.ituring.com.cn/article/37642