Go语言中面向对象
面向?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语言讲解深拷贝与浅拷贝
- 下一篇: Go语言 读写锁互斥锁原理剖析(1)