1. 程式人生 > >golang介面使用說明

golang介面使用說明

介面在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.所以,介面與介面的方法相關,與介面名稱無關。
                如果要實現介面,就要實現接口裡的所有方法。

*/