【Golang 基礎】Go 語言的介面
Go 語言中的介面
Go 語言中的介面就是方法簽名的集合,介面只有宣告,沒有實現,沒有資料欄位。
-
只要某個型別擁有了該介面的所有方法,即該型別就算實現了該介面
,無需顯式宣告實現了哪個介面,這被稱為
Structurol Typing
;
package main import "fmt" // 定義 Usb 介面 type Usb interface { GetName() string Connection() } // 定義 Phone 結構 type Phone struct { Name string } // 實現 Usb 介面的 GetName 方法 func (p Phone) GetName() string { return p.Name } // 實現 Usb 介面的 Connection 方法 func (p Phone) Connection() { fmt.Println("Connection:", p.GetName()) } func main() { iPhone := Phone{Name:"iPhone"} fmt.Println(iPhone.GetName()) // iPhone iPhone.Connection()// Connection:iPhone }
-
Go 允許不帶任何方法簽名的介面,這種型別的介面被稱為
empty interface
,按照第一條結論,只要某個型別擁有了某個介面的所有方法,那麼該型別就實現了該介面 ,所以所有型別都實現了empty interface
; -
當物件賦值給介面時,會發生拷貝。介面內部儲存的是指向這個複製品的指標,無法修改其狀態,也無法獲取指標;
iPhone := Phone{Name: "iPhone"} var usb = Usb(iPhone) fmt.Println(iPhone.GetName()) // iPhone fmt.Println(usb.GetName())// iPhone iPhone.Name = "SAMSUNG" fmt.Println(iPhone.GetName()) // SAMSUNG fmt.Println(usb.GetName())// iPhone
- 介面可以作為任何型別資料的容器。
// 定義呼叫介面方法 func InvokInterface(inter interface{}) { // inter.(type) 用於獲取型別 switch t := inter.(type) { case Usb: t.Connection() case string: fmt.Println(t) default: fmt.Println("Unkown") } } function main() { iPhone := Phone{Name: "iPhone"} var usb = Usb(iPhone) hello := "Hello World" const PI = 3.14 InvokerInterface(iPhone) // Connection: iPhone InvokerInterface(usb)// Connection: iPhone InvokerInterface(hello)// Hello World InvokerInterface(PI)// Unkown }