Go語言規格說明書 之 接口類型(Interface types)
go version go1.11 windows/amd64
本文為閱讀Go語言中文官網的規則說明書(https://golang.google.cn/ref/spec)而做的筆記,介紹Go語言的 接口類型(Interface types)。
接口類型應該是從軟件設計上考慮才接入的類型,它本身不實現任何功能,但會 聲明 一些功能。
在Go語言中,任何 實現 了接口類型中 聲明 的功能的類型,都可以成為 實現了 某接口。
比如,聲明一個 汽車接口,裏面包含若幹方法,任何實現了這個 汽車接口 的的類型 都可以被稱為 汽車,不過,有些是 汽油柴油動力汽車,有些是電動汽車。
而且,一個類型可以實現多個接口,只要這個類型的 方法集 包含 某個 接口類型 所聲明的文件,就可以稱 這個類型實現了這個接口。
上面是閱讀了官文後自己對 接口類型 和 其它類型、方法集 等概念的理解,下面是補充,涵蓋怎麽使用接口類型的的信息。
接口類型 中聲明的方法 即使 接口類型的 方法集——不只是普通類型有方法集,接口類型也有。
可以用接口類型聲明變量,未初始化的接口類型變量為 nil。
接口類型變量 可以存儲 任何方法集涵蓋了接口類型方法集 的類型 的值。
接口類型變量怎麽初始化呢?new函數!下面是來自RUNOOB.COM的示例代碼:
package main import ( "fmt" ) type Phone interface { call() } type NokiaPhone struct { } func (nokiaPhone NokiaPhone) call() { fmt.Println("I am Nokia, I can call you!") } type IPhone struct { } func (iPhone IPhone) call() { fmt.Println("I am iPhone, I can call you!") } func main() { var phone Phone phone = new(NokiaPhone) phone.call() phone = new(IPhone) phone.call() }
接口類型 的方法集 的名稱必須是 非空 且 唯一 的(a unique non-blank name)——和前文將的結構體類型不一樣,結構體類型有空域。
牢記:
多個類型 可以 實現 一個接口;
一個類型 可以 實現 多個接口。
空接口:
任何類型都實現了 空接口。
空接口 不是 nil。
interface{}
最後,接口類型嵌套——在 接口類型 定義中,直接使用 另一個接口類型的名稱,這樣,另一個接口類型的方法就被 嵌套到 新的接口類型中了。
註意,被嵌入接口類型 的方法集中的方法 和 新接口類型中定義的方法名稱 不能沖突,保持 唯一性。
註意,接口類型不能 以任何形式嵌入其自身。
其實,接口類型在之前的一篇博文中介紹過,不過,那時是理解不深刻,寫了這樣單獨的一篇博文,對接口類型了解的更清楚了。當然,還需要更多的運用、實踐才行。
官文示例及俺的解讀:
// A simple File interface interface { Read(b Buffer) bool Write(b Buffer) bool Close() } // 需要查看 類型的方法定義 文檔,下面的類型T實現了上面的接口 func (p T) Read(b Buffer) bool { return … } func (p T) Write(b Buffer) bool { return … } func (p T) Close() { … } // type 類型定義語句 // 和結構體一樣,只有使用type語句給接口類型定義了一個標識符了,接口類型才可以很好地使用 // 當然,不排除匿名接口類型的使用,一般為一次性的 // 定義接口類型後,直接 聲明 變量? type Locker interface { Lock() Unlock() } type ReadWriter interface { Read(b Buffer) bool Write(b Buffer) bool } // 嵌入類型 type File interface { ReadWriter // same as adding the methods of ReadWriter Locker // same as adding the methods of Locker Close() } // 嵌入的類型導致方法名稱沖突 type LockedFile interface { Locker File // illegal: Lock, Unlock not unique Lock() // illegal: Lock not unique } // 不能嵌套自身——循環嵌套 // illegal: Bad cannot embed itself type Bad interface { Bad } // illegal: Bad1 cannot embed itself using Bad2 type Bad1 interface { Bad2 } type Bad2 interface { Bad1 }
參考鏈接:
1.Go 語言接口
Go語言規格說明書 之 接口類型(Interface types)