Go語言中物件導向

2021-10-05 06:24:42 字數 2839 閱讀 4699

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物件導向

匿名字段 只提供型別,不寫欄位名 所有的內建型別和自定義型別都是可以作為匿名欄位去使用。介面 定義物件的行為規範,規範的細節由具體的物件實現。介面是乙個或多個方法簽名的集合。任何型別的方法集中只要擁有該介面 對應的全部方法 簽名。就表示它 實現 了該介面,無須在該型別上顯式宣告實現了哪個介面。這稱為...