go語言中沒有明確的oop(object oriented programming)概念。
go語言只提供了兩個關鍵型別:struct,inte***ce。
1、struct與c++語言中的普通struct相似,在go語言中是借助著struct結構體才實現的
2、inte***ce是抽象類的型別,inte***ce則是方法宣告的集合。
go語言中,成員變數/方法大寫開頭是公有成員變數/方法,成員變數/方法小寫開頭為私有成員變數/方法。
示例講解:
該例中,我們定義了乙個汽車struct結構,在go語言中可以視為類,類私有成員包括:品牌、型號,顏色和能源型別所組成。
type car struct
在go語言中我們一般情況下使用new+結構體名稱的規則來定義構造方法,建構函式中例項car類和初始化類成員。
// 構造方法
func newcar(brand, model, color, energytype string) *car
}
接下來我們定義乙個類成員方法,該方法用於列印類的所有成員變數。
// 獲取car的資訊
func (c *car) getcarinfo()
該方法用於獲取car的資訊,列印出所有類成員變數的值,func和方法名之間的「c *car」是指標型別(c為指標變數用於操作類成員,car為具體歸屬於哪個類),如果使用指標方式是為了需要修改類成員值,非指標時不能覆蓋成員變數的值。
我們來測試一下上面的程式:
var car = newcar("豐田", "凱美瑞", "黑色", "汽油")
car.getcarinfo()
輸出結果:
car's brand is : 豐田, model is 凱美瑞, color is : 黑色, energy type : 汽油
我們可以看到,我們私有成員變數的值在構造的時候被修改了,在呼叫列印的時候被輸出出來了。
像php語言中需要使用extends來整合,go語言中沒有顯示的類的繼承,我們可以通過組合的形式來實現類的繼承。
type energytypecar struct
func (et *energytypecar) getenergytypeinfo()
我們定義乙個energytypecar類,通過組合的方式整合於car,並有自己的類成員為speedup來表示百公里加速。我們執行上面的**結果為:
10s}
我是新型汽車類,我的百公里加速為:10s
car's brand is : 北汽新能源, model is ec5, color is : 白色, energy type : 純電
我們可以看到,組合後除了整合了car以外,還新增了自己的成員變數和方法。
多型是執行時的特性,而繼承是編譯時的特性。繼承關係在編譯的時候就就是已經確定的,而多型是執行的時候動態繫結的。
蘋果手機和安卓手機都屬於手機,具備打**、發簡訊和上網的功能,我們把他們共同的屬性抽象成介面表達:
// 定義手機功能
type phone inte***ce
蘋果手機:
type iphone struct{}
func (p *iphone) call(to string)
func (p *iphone) sendmessage(to string)
func (p *iphone) oninternet()
安卓手機:
type android struct{}
func (p *android) call(to string)
func (p *android) sendmessage(to string)
func (p *android) oninternet()
多型實現:
func pcall(p phone, to string)
func psendmessage(p phone, to string)
func poninternet(p phone)
pcall(iphone, "user 1")
psendmessage(iphone, "user 1")
poninternet(iphone)
fmt.println()
var android = &android{}
pcall(android, "user 2")
psendmessage(android, "user 1")
poninternet(android)
執行結果:
使用iphone手機打**給:user 1
使用iphone手機發簡訊給:user 1
使用iphone手機上網
使用android手機打**給:user 2
使用android手機發簡訊給:user 1
使用android手機上網
到這裡面我們可以看到,通過抽象的介面和方法完成了go語言執行時的動態繫結,這也就是go語言中的抽象和多型了。 go語言物件導向
go語言可通過struct宣告新的型別 新建乙個型別person type person struct var p1 person p1.name liming p1.age 18新建乙個型別student,可以通過匿名欄位將person所有欄位隱式引入student type student st...
GO語言物件導向
當初開發go語言的時候就是因為c 的特性太過於繁雜,從而使得很多c 的開發者因為c 的特性而頭疼,go語言成功的精簡了c 的特性,使其很簡潔,很少的特性,卻可以完成很多的事情。go語言中並沒有像c j a語言中這類的class,它只含有像c語言中的結構體,用結構體和指標等特性,完成乙個類的作用,很巧...
Go語言中文文件 05物件導向
匿名字段 只提供型別,不寫欄位名 所有的內建型別和自定義型別都是可以作為匿名欄位去使用。介面 定義物件的行為規範,規範的細節由具體的物件實現。介面是乙個或多個方法簽名的集合。任何型別的方法集中只要擁有該介面 對應的全部方法 簽名。就表示它 實現 了該介面,無須在該型別上顯式宣告實現了哪個介面。這稱為...