佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 詳解go中的引用類型

詳解go中的引用類型

熱門標(biāo)簽:地方門戶網(wǎng)站 網(wǎng)站排名優(yōu)化 服務(wù)外包 鐵路電話系統(tǒng) 百度競價排名 AI電銷 Linux服務(wù)器 呼叫中心市場需求

值類型和引用類型

值類型:int、float、bool和string這些類型都屬于值類型,使用這些類型的變量直接指向存在內(nèi)存中的值,值類型的變量的值存儲在棧中。當(dāng)使用等號=將一個變量的值賦給另一個變量時,如 j = i ,實際上是在內(nèi)存中將 i 的值進行了拷貝。可以通過 i 獲取變量 i 的內(nèi)存地址。  值拷貝

引用類型:特指slice、map、channel這三種預(yù)定義類型。引用類型擁有更復(fù)雜的存儲結(jié)構(gòu):(1)分配內(nèi)存 (2)初始化一系列屬性等一個引用類型的變量r1存儲的是r1的值所在的內(nèi)存地址(數(shù)字),或內(nèi)存地址中第一個字所在的位置,這個內(nèi)存地址被稱之為指針,這個指針實際上也被存在另外的某一個字中。 

兩者的主要區(qū)別:拷貝操作和函數(shù)傳參。

正文開始重點給大家介紹go中的引用類型。

首先,go中的賦值,都是值傳遞

a := 1
b := a

x := Struct{}
y := x

他們都是在內(nèi)存中有獨立空間的,也就是 copy 的過程,所以這里對y的某個屬性的改動,并不會影響x

那么我們要讓兩個變量指向同一個內(nèi)存怎么辦呢,可以使用引用類型:

y := x

這時候,y的類型是 *Struct ,這時候我們可以對y進行修改,修改完之后,x也會發(fā)現(xiàn)變化,因為y現(xiàn)在是一個引用類型,他指向的是x結(jié)構(gòu)體所在的內(nèi)存

我們可以通過:

y.variable = xxx

來直接調(diào)用引用類型的結(jié)構(gòu)體賦值,但是要注意的是,這是go的語法糖,他只是幫助我們簡化了通過指針來獲取實際內(nèi)存的過程,完整的寫法應(yīng)該是這樣的:

(*y).variable = xxx

*y 是對指針的反引用,可以理解為 *y == x 。

為什么設(shè)計這個語法糖呢,是因為在go里面我們是無法直接操作指針,像c++中直接對內(nèi)存地址進行計算進而得到其他內(nèi)存地址的運算,在go里面是默認不支持的

print(y) // 得到類似0x8123這樣的內(nèi)存地址數(shù)據(jù)

// 理論上可以得到一個新的內(nèi)存地址,但是在go里默認是不支持的
newAddr := y + 4

因為無法直接操作地址,所以go就提供語法糖,讓我們在使用引用類型進行操作的時候,默認就是對引用所指向的內(nèi)存地址進行操作。

注意我們是可以對引用類型直接賦值的,但是賦值的類型也必須是引用類型

y = Struct{} // 這樣是可以的,但是不能是y = Struct{}

a := 1
b := a
b = 2  // 這是不行的,因為b的類型是 *int

特殊的引用類型

能夠通過 make() 函數(shù)創(chuàng)建的都是引用類型,比如 slice 和 map , slice 雖然看起來像數(shù)組,但是他其實是一個指向數(shù)組內(nèi)存空間的一個指針類型

type Slice struct {
 point Point // 內(nèi)存地址
 len int
 cap int
}

所以我們在執(zhí)行:

a := []int
b = a

會發(fā)現(xiàn),好像b和a指向的是同一個數(shù)組,事實確實如此。 go中所有的賦值都是值傳遞,而slice的賦值,也是對slice對象的一次拷貝,也就是說a和b是不同的slice對象,但是他們指向同一個數(shù)組

同理map也是如此,就不多講來。

總結(jié)

到此這篇關(guān)于詳解go中的引用類型的文章就介紹到這了,更多相關(guān)go中的引用類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • django開發(fā)之settings.py中變量的全局引用詳解
  • JS中引用百度地圖并將百度地圖的logo和信息去掉
  • MongoDB學(xué)習(xí)筆記(六) MongoDB索引用法和效率分析
  • google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
  • golang中值類型/指針類型的變量區(qū)別總結(jié)
  • Go語言的方法接受者類型用值類型還是指針類型?
  • Go語言基礎(chǔ)知識總結(jié)(語法、變量、數(shù)值類型、表達式、控制結(jié)構(gòu)等)

標(biāo)簽:崇左 仙桃 黃山 蘭州 湖南 湘潭 銅川 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解go中的引用類型》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    田阳县| 金阳县| 临颍县| 绥化市| 驻马店市| 通道| 锡林浩特市| 英山县| 汉源县| 淳化县| 宝山区| 海淀区| 静宁县| 科尔| 宣威市| 临高县| 沁阳市| 广宗县| 凤冈县| 玉田县| 宿松县| 徐水县| 偏关县| 壶关县| 治多县| 句容市| 抚州市| 延安市| 长乐市| 阳曲县| 龙胜| 莒南县| 武平县| 澄江县| 镶黄旗| 彭山县| 永丰县| 广丰县| 古蔺县| 巨鹿县| 阿荣旗|