日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Go语言中面向对象

發(fā)布時(shí)間:2024/1/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go语言中面向对象 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

面向?qū)ο?#xff1a;

Go語(yǔ)言中沒(méi)有明確的OOP(Object Oriented Programming)概念。

Go語(yǔ)言只提供了兩個(gè)關(guān)鍵類型:struct,interface。

1、struct與C++語(yǔ)言中的普通struct相似,在Go語(yǔ)言中是借助著struct結(jié)構(gòu)體才實(shí)現(xiàn)的

2、interface是抽象類的類型,interface則是方法聲明的集合。

Go語(yǔ)言中,成員變量/方法大寫開(kāi)頭是公有成員變量/方法,成員變量/方法小寫開(kāi)頭為私有成員變量/方法。

一、類的封裝

示例講解:

該例中,我們定義了一個(gè)汽車struct結(jié)構(gòu),在Go語(yǔ)言中可以視為類,類私有成員包括:品牌、型號(hào),顏色和能源類型所組成。

type Car struct {brand string // 品牌model string // 型號(hào)color string // 顏色energyType string // 能源類型 }

在Go語(yǔ)言中我們一般情況下使用New+結(jié)構(gòu)體名稱的規(guī)則來(lái)定義構(gòu)造方法,構(gòu)造函數(shù)中實(shí)例Car類和初始化類成員。

// 構(gòu)造方法 func NewCar(brand, model, color, energyType string) *Car {return &Car{brand: brand,model: model,color: color,energyType: energyType,} }

接下來(lái)我們定義一個(gè)類成員方法,該方法用于打印類的所有成員變量。

// 獲取car的信息 func (c *Car) GetCarInfo() {fmt.Printf("Car's Brand is : %s, Model is %s, Color is : %s, Energy Type : %s \n",c.brand, c.model, c.color, c.energyType) }

該方法用于獲取Car的信息,打印出所有類成員變量的值,func和方法名之間的“c *Car”是指針類型(c為指針變量用于操作類成員,Car為具體歸屬于哪個(gè)類),如果使用指針?lè)绞绞菫榱诵枰薷念惓蓡T值,非指針時(shí)不能覆蓋成員變量的值。

我們來(lái)測(cè)試一下上面的程序:

var car = NewCar("豐田", "凱美瑞", "黑色", "汽油") car.GetCarInfo()

輸出結(jié)果:

Car's Brand is : 豐田, Model is 凱美瑞, Color is : 黑色, Energy Type : 汽油

我們可以看到,我們私有成員變量的值在構(gòu)造的時(shí)候被修改了,在調(diào)用打印的時(shí)候被輸出出來(lái)了。

二、類的繼承:

像PHP語(yǔ)言中需要使用extends來(lái)集成,Go語(yǔ)言中沒(méi)有顯示的類的繼承,我們可以通過(guò)組合的形式來(lái)實(shí)現(xiàn)類的繼承。

type EnergyTypeCar struct {CarSpeedUp string // 定義加速,我們假設(shè)是百公里加速。 }func (et *EnergyTypeCar) GetEnergyTypeInfo() {fmt.Printf("我是新型汽車類,我的百公里加速為:%s\n", et.SpeedUp) }

我們定義一個(gè)EnergyTypeCar類,通過(guò)組合的方式集成于Car,并有自己的類成員為SpeedUp來(lái)表示百公里加速。我們運(yùn)行上面的代碼結(jié)果為:

{{北汽新能源 EC5 白色 純電} 10s} 我是新型汽車類,我的百公里加速為:10s Car's Brand is : 北汽新能源, Model is EC5, Color is : 白色, Energy Type : 純電

我們可以看到,組合后除了集成了Car以外,還新增了自己的成員變量和方法。

三、類的多態(tài)

多態(tài)是運(yùn)行時(shí)的特性,而繼承是編譯時(shí)的特性。繼承關(guān)系在編譯的時(shí)候就就是已經(jīng)確定的,而多態(tài)是運(yùn)行的時(shí)候動(dòng)態(tài)綁定的。

蘋果手機(jī)和安卓手機(jī)都屬于手機(jī),具備打電話、發(fā)短信和上網(wǎng)的功能,我們把他們共同的屬性抽象成接口表達(dá):

// 定義手機(jī)功能 type Phone interface {Call(to string) // 打電話SendMessage(to string) // 發(fā)短信OnInternet() // 上網(wǎng) }

蘋果手機(jī):

type IPhone struct{}func (p *IPhone) Call(to string) {fmt.Printf("使用IPhone手機(jī)打電話給:%s\n", to) } func (p *IPhone) SendMessage(to string) {fmt.Printf("使用IPhone手機(jī)發(fā)短信給:%s\n", to) } func (p *IPhone) OnInternet() {fmt.Println("使用IPhone手機(jī)上網(wǎng)") }

安卓手機(jī):

type Android struct{}func (p *Android) Call(to string) {fmt.Printf("使用Android手機(jī)打電話給:%s\n", to) } func (p *Android) SendMessage(to string) {fmt.Printf("使用Android手機(jī)發(fā)短信給:%s\n", to) } func (p *Android) OnInternet() {fmt.Println("使用Android手機(jī)上網(wǎng)") }

多態(tài)實(shí)現(xiàn):

func PCall(p Phone, to string) {p.Call(to) }func PSendMessage(p Phone, to string) {p.SendMessage(to) }func POnInternet(p Phone) {p.OnInternet() }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)

運(yùn)行結(jié)果:

使用IPhone手機(jī)打電話給:user 1 使用IPhone手機(jī)發(fā)短信給:user 1 使用IPhone手機(jī)上網(wǎng)使用Android手機(jī)打電話給:user 2 使用Android手機(jī)發(fā)短信給:user 1 使用Android手機(jī)上網(wǎng)

到這里面我們可以看到,通過(guò)抽象的接口和方法完成了Go語(yǔ)言運(yùn)行時(shí)的動(dòng)態(tài)綁定,這也就是Go語(yǔ)言中的抽象和多態(tài)了。

總結(jié)

以上是生活随笔為你收集整理的Go语言中面向对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。