golang介面使用說明
阿新 • • 發佈:2018-12-23
介面在golang中使用的特別多,在此加以簡單的總結:
golang介面使用說明:
(1)空介面(沒有任何方法的介面)可以看成是萬能資料型別,可以接收任意型別的資料;如果是包含方法的介面,給該介面賦值,對應的值物件需要實現該介面的所有方法才可以。
(2)介面本身不能建立例項,但是可以指向一個實現了該介面的自定義型別的變數(例項)
(3)介面中的所有方法都沒有方法體,即都是沒有實現的方法。
(4)在golang中,一個自定義型別需要將該介面對應的方法都實現,才能說該型別實現了該介面。
(5)只要是自定義資料型別,就可以實現介面,不僅僅是結構體型別。
(6)一個自定義型別,可以同時實現多個介面。(如可以同時實現 A介面 B介面)
(7)若兩個介面包含一樣的方法,一個自定義型別實現了所有的方法,則該型別實現了這兩個介面。介面的實現主要是通過方法來標記,而不是介面名稱。
(8)介面型別預設是一個指標(引用型別),如果沒有初始化就使用,就會輸出nil。
(9)golang介面中,不能包含任意變數。
package main import "fmt" type USB interface { working() stop() } type USB1 interface { working() stop() } //定義Phone物件 type Phone struct { } //定義Cameron物件 type Cameron struct { } //定義Computer物件 type Computer struct { } //分別讓兩個物件實現USB的方法 func (p Phone) working() { fmt.Println("手機開始工作。。。") } func (p Phone) stop() { fmt.Println("手機停止工作") } func (c Cameron) working() { fmt.Println("照相機開始工作。。。") } func (c Cameron) stop() { fmt.Println("照相機停止工作") } func (c Computer) work(usb USB) { //具有相同介面的物件(struct)都可以作為函式引數(包含多型、高內聚低耦合的思想) usb.working() usb.stop() } //自定義型別的變數 都可以實現介面,不一定是struct type MyInt int func (i MyInt) working() { fmt.Println("自定義型別的 working() 方法") } func (i MyInt) stop() { fmt.Println("自定義型別的 stop() 方法") } func main() { c := Computer{} ca := Cameron{} ph := Phone{} c.work(ca) //由於Cameron實現了USB的介面,所以型別可以和USB進行匹配 c.work(ph) //由於phone實現了USB的介面,所以型別可以和USB進行匹配 fmt.Println("------------") var usb USB var myInt MyInt usb = myInt //賦值給介面(包含方法),myInt需要實現該介面的所有方法。 usb.stop() myInt.working() } /* 特別說明: golang中實現介面不需要顯示來實現(Java中通過關鍵字,golang中介面對應的方法來實現) 如程式所示,物件通過 working()、stop()方法的實現,實現了介面USB、USB1.所以,介面與介面的方法相關,與介面名稱無關。 如果要實現介面,就要實現接口裡的所有方法。 */