Go語(yǔ)言沒有繼承、構(gòu)造函數(shù)和析構(gòu)函數(shù)等概念,但是它是面向?qū)ο蟮摹?/p>
.net中類型系統(tǒng)分為值類型和引用類型,兩種轉(zhuǎn)換需要進(jìn)行裝箱和拆箱,都是繼承自O(shè)bject類型
Go語(yǔ)言大多數(shù)類型都是值類型,需要的話可以給任何類型增加功能
1.為類型添加方法
C++等語(yǔ)言的面向?qū)ο蠖枷喈?dāng)于C語(yǔ)言的一個(gè)語(yǔ)法糖
下面看看Go語(yǔ)言如何實(shí)現(xiàn)面向?qū)ο蟮?/p>
可以看出,面向?qū)ο笾皇菗Q了一種語(yǔ)法形式來表達(dá)。C++語(yǔ)言的面向?qū)ο笾宰層行┤嗣曰蟮?/p>
一大原因就在于其隱藏的this指針。而Java和C#其實(shí)都是遵循著C++語(yǔ)言的慣例而設(shè)計(jì)的,它們的成員方法中都帶有一個(gè)隱藏的this指針。如果讀者了解Python語(yǔ)法,就會(huì)知道Python的成員方法中會(huì)有一個(gè)self參數(shù),它和this指針的作用是完全一樣的。
“在Go語(yǔ)言中沒有隱藏的this指針”這句話的含義是:
- 方法施加的目標(biāo)(也就是“對(duì)象”)顯式傳遞,沒有被隱藏起來;
- 方法施加的目標(biāo)(也就是“對(duì)象”)不需要非得是指針,也不用非得叫this。
我的理解:像C#這樣的語(yǔ)言,在使用面向?qū)ο蟮姆绞綍r(shí)候,其中this是隱藏起來的,所以在內(nèi)部使用this就代表了對(duì)象自己,但是Go語(yǔ)言中不去隱藏這個(gè)this,是顯示寫出來的,如下面的(a Integer),既然顯示表示了,那么叫什么也就無所謂了。
type Integer int func (a Integer) Less(b Integer) bool { return a < b }
不必傳指針的原因在于,不是所有的方法都是需要修改對(duì)象,對(duì)于很小的對(duì)象(比如4字節(jié)),如果傳指針會(huì)有額外的成本。
2.值語(yǔ)義和引用語(yǔ)義
b = a
b.Modify()
如果b的修改不會(huì)影響a的值,那么此類型屬于值類型。如果會(huì)影響a的值,那么此類型是引用類型。
Go語(yǔ)言中的大多數(shù)類型都基于值語(yǔ)義,包括:
- 基本類型,如byte、int、bool、float32、float64和string等;
- 復(fù)合類型,如數(shù)組(array)、結(jié)構(gòu)體(struct)和指針(pointer)等。
這里書上特意強(qiáng)調(diào)了數(shù)組(array),他是值類型的,對(duì)比了C語(yǔ)言的數(shù)組,C語(yǔ)言的數(shù)組可能會(huì)表現(xiàn)為多個(gè)形態(tài),當(dāng)作為函數(shù)的參數(shù)傳遞的時(shí)候是引用類型,當(dāng)作為結(jié)構(gòu)體的變量又是值類型(表現(xiàn)為賦值時(shí)候是復(fù)制了一份)
以下是引用語(yǔ)義
- 數(shù)組切片:指向數(shù)組(array)的一個(gè)區(qū)間。
- map:極其常見的數(shù)據(jù)結(jié)構(gòu),提供鍵值查詢能力。
- channel:執(zhí)行體(goroutine)間的通信設(shè)施。
- 接口(interface):對(duì)一組滿足某個(gè)契約的類型的抽象。
到此這篇關(guān)于Go語(yǔ)言面向?qū)ο蟮奈恼戮徒榻B到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。