這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
概述
Golang語言的物件導向與c++,py等語言有所不同,是由於Golang不支援繼承;與上述支援彙總和繼承的物件導向的語言不同,Golang只支援彙總(也叫做組合)和嵌入。彙總和嵌入的區別:
type ColoredPoint struct { color.Color //匿名欄位(嵌入) x, y int //具名欄位(彙總)}warning:(point := ColoredPoint{}) 欄位訪問: point.x , point.y, point.Color [當訪問來自於其他pkg的類型欄位時候,只用到了其名字的最後一部分]
在傳統物件導向的編程中,“類(class)", "對象(object)", "執行個體(instance)"被定義了很清晰。在Golang完全沒有這些術語,而是使用"類型(type)" 和 "值(value)"來取代,其中自訂類型的值可以包含方法;
由於Golang中沒有繼承,也就沒有虛函數。Golang對此的支援採用型別安全的鴨子類型(duck type)。簡單概況為:在Golang中,參數可以被聲明為一個具體類型(例如int,string,或者*os.File 以及MyType),也可以是介面(interface),即提供了具有滿足該介面的方法的值。
對於一個聲明為介面的參數,可傳入任意值,只要該值包含該介面所聲明的方法。無論該值的實際類型是什麼;
這點異常靈活強大,特別是與Golang所支援的訪問嵌入欄位的方法相結合時;
取代繼承
繼承的優勢是,有些方法在基類中實現一次,子類中即可使用;Golang為此提供了兩個解決方案:
- 使用嵌入; 嵌入一個類型,方法值需要在所嵌入的類型中實現一次,即可在所有包含該嵌入類型的類型中使用;
- 為每一種類型提供獨立的方法; 簡單地封裝功能性作用的代碼放進一個函數中,然後讓所有類的方法都調用這個函數;
Golang Interface
Golang物件導向編程中另一個與眾不同點是它的介面,值和方法都保持獨立。
- 介面用於聲明方法簽名
- 結構體用於聲明彙總或者嵌入的值
- 方法用於聲明在自訂類型(通常為結構體)上的操作
在自訂類型的方法和任何特殊介面之間沒有顯示的聯絡。但如果該類型的方法滿足一個或多個介面,那麼該類型的值可以用於任何接受該介面的值的地方。當然,每一個類型都滿足空介面(interface{}), 因此任何值都可以用於聲明了空介面的地方;