這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go程式設計語言:支援並發、記憶體回收的編譯型系統級程式設計語言!本文主要是按照無聞的《Go 編程基礎》開源視頻學習並記錄筆記。
一、介面interface
1、基本概念
Go 語言提供了另外一種資料類型即介面,它把所有的具有共性的方法定義在一起,任何其他類型只要實現了這些方法就是實現了這個介面。
2、定義
/* 定義介面 */type interface_name interface { method_name1 [return_type] method_name2 [return_type] method_name3 [return_type] ... method_namen [return_type]}/* 定義結構體 */type struct_name struct { /* variables */}/* 實現介面方法 */func (struct_name_variable struct_name) method_name1() [return_type] { /* 方法實現 */}...func (struct_name_variable struct_name) method_namen() [return_type] { /* 方法實現*/}
樣本:
package mainimport ( "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()}
在上面的例子中,我們定義了一個介面Phone,介面裡面有一個方法call()。然後我們在main函數裡面定義了一個Phone類型變數,並分別為之賦值為NokiaPhone和IPhone。然後調用call()方法,輸出結果如下:
I am Nokia, I can call you!I am iPhone, I can call you!
3、特性
- 介面是一個或多個
方法簽名的集合
- 只要某個類型擁有該介面的所有方法簽名,即算實現該介面,無需顯示聲明了哪個介面,這稱為 Structural Typing
- 介面只有方法聲明,沒有實現,沒有資料欄位
- 介面可以匿名嵌入其他介面,或嵌入到結構中
- 將對象賦值給介面時,會發生拷貝,而介面內部儲存的是指向這個複製品的指標,既無法修改複製品的狀態,也無法擷取指標
- 只有當介面儲存的類型和對象都為nil時,介面才等於nil
- 介面調用不會做receiver的自動轉換
- 介面同樣支援匿名欄位方法
- 介面也可實作類別似OOP中的多態
- 空介面可以作為任何類型資料的容器
樣本:
package mainimport "fmt" // 定義一個介面類型type USB interface { Name() string Connect()}// 上邊的方法可以使用下面的一種嵌入式修改/*type Connecter interface { Connect()}type USB interface { Name() string Connecter}*/// 定義一個結構體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 := usb.(PhoneConnecter); ok { fmt.Println("Disconnect:", pc.name) return } fmt.Println("Unknow device")}func main() { var a USB a = PhoneConnecter{"PhoneConnecter"} a.Connect() Disconnect(a)}
列印:
➜ myfirstgo go run interface.goConnect: PhoneConnecterDisconnect: PhoneConnecter