主頁(yè) > 知識(shí)庫(kù) > 詳解go中的引用類(lèi)型

詳解go中的引用類(lèi)型

熱門(mén)標(biāo)簽:澳門(mén)防封電銷(xiāo)卡 烏魯木齊人工電銷(xiāo)機(jī)器人系統(tǒng) 福州鐵通自動(dòng)外呼系統(tǒng) 智能電銷(xiāo)機(jī)器人營(yíng)銷(xiāo) 地圖標(biāo)注測(cè)試 賺地圖標(biāo)注的錢(qián)犯法嗎 濮陽(yáng)自動(dòng)外呼系統(tǒng)代理 長(zhǎng)沙ai機(jī)器人電銷(xiāo) 廣東語(yǔ)音外呼系統(tǒng)供應(yīng)商

值類(lèi)型和引用類(lèi)型

值類(lèi)型:int、float、bool和string這些類(lèi)型都屬于值類(lèi)型,使用這些類(lèi)型的變量直接指向存在內(nèi)存中的值,值類(lèi)型的變量的值存儲(chǔ)在棧中。當(dāng)使用等號(hào)=將一個(gè)變量的值賦給另一個(gè)變量時(shí),如 j = i ,實(shí)際上是在內(nèi)存中將 i 的值進(jìn)行了拷貝??梢酝ㄟ^(guò) i 獲取變量 i 的內(nèi)存地址。  值拷貝

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

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

正文開(kāi)始重點(diǎn)給大家介紹go中的引用類(lèi)型。

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

a := 1
b := a

x := Struct{}
y := x

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

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

y := x

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

我們可以通過(guò):

y.variable = xxx

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

(*y).variable = xxx

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

為什么設(shè)計(jì)這個(gè)語(yǔ)法糖呢,是因?yàn)樵趃o里面我們是無(wú)法直接操作指針,像c++中直接對(duì)內(nèi)存地址進(jìn)行計(jì)算進(jìn)而得到其他內(nèi)存地址的運(yùn)算,在go里面是默認(rèn)不支持的

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

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

因?yàn)闊o(wú)法直接操作地址,所以go就提供語(yǔ)法糖,讓我們?cè)谑褂靡妙?lèi)型進(jìn)行操作的時(shí)候,默認(rèn)就是對(duì)引用所指向的內(nèi)存地址進(jìn)行操作。

注意我們是可以對(duì)引用類(lèi)型直接賦值的,但是賦值的類(lèi)型也必須是引用類(lèi)型

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

a := 1
b := a
b = 2  // 這是不行的,因?yàn)閎的類(lèi)型是 *int

特殊的引用類(lèi)型

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

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

所以我們?cè)趫?zhí)行:

a := []int
b = a

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

同理map也是如此,就不多講來(lái)。

總結(jié)

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

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

標(biāo)簽:德州 西雙版納 貴陽(yáng) 調(diào)研邀請(qǐng) 慶陽(yáng) 廣西 太原 阿克蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解go中的引用類(lèi)型》,本文關(guān)鍵詞  詳解,中的,引用,類(lèi)型,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解go中的引用類(lèi)型》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于詳解go中的引用類(lèi)型的相關(guān)信息資訊供網(wǎng)民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章