欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解go中的引用類型

 更新時(shí)間:2020年03月15日 14:50:31   作者:Jokcy ·  
這篇文章主要介紹了go中的引用類型,文中給大家提到了值類型和引用類型的區(qū)別,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

值類型和引用類型

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

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

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

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

首先,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)存怎么辦呢,可以使用引用類型:

y := &x

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

我們可以通過(guò):

y.variable = xxx

來(lái)直接調(diào)用引用類型的結(jié)構(gòu)體賦值,但是要注意的是,這是go的語(yǔ)法糖,他只是幫助我們簡(jiǎn)化了通過(guò)指針來(lái)獲取實(shí)際內(nèi)存的過(guò)程,完整的寫法應(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) // 得到類似0x8123這樣的內(nèi)存地址數(shù)據(jù)

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

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

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

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

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

特殊的引用類型

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

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

相關(guān)文章

  • 代碼之美:探索Go語(yǔ)言斷行規(guī)則的奧秘

    代碼之美:探索Go語(yǔ)言斷行規(guī)則的奧秘

    Go語(yǔ)言是一門以簡(jiǎn)潔、清晰和高效著稱的編程語(yǔ)言,而斷行規(guī)則是其代碼風(fēng)格的重要組成部分,通過(guò)深入研究Go語(yǔ)言的斷行規(guī)則,我們可以更好地理解和編寫優(yōu)雅的代碼,本文將從語(yǔ)法規(guī)范、代碼風(fēng)格和最佳實(shí)踐等方面進(jìn)行探討,幫助讀者更好地理解和應(yīng)用Go語(yǔ)言的斷行規(guī)則
    2023-10-10
  • 在Go中格式化字符串的幾種常用方法

    在Go中格式化字符串的幾種常用方法

    Go對(duì)字符串格式化提供了良好的支持,這篇文章主要給大家介紹了關(guān)于在Go中格式化字符串的幾種常用方法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Go具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • 詳解Golang官方中的一致性哈希組件

    詳解Golang官方中的一致性哈希組件

    這篇文章主要為大家詳細(xì)介紹了Golang官方中的一致性哈希組件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • 基于Golang實(shí)現(xiàn)延遲隊(duì)列(DelayQueue)

    基于Golang實(shí)現(xiàn)延遲隊(duì)列(DelayQueue)

    延遲隊(duì)列是一種特殊的隊(duì)列,元素入隊(duì)時(shí)需要指定到期時(shí)間(或延遲時(shí)間),從隊(duì)頭出隊(duì)的元素必須是已經(jīng)到期的。本文將用Golang實(shí)現(xiàn)延遲隊(duì)列,感興趣的可以了解下
    2022-09-09
  • Golang?Fasthttp選擇使用slice而非map?存儲(chǔ)請(qǐng)求數(shù)據(jù)原理探索

    Golang?Fasthttp選擇使用slice而非map?存儲(chǔ)請(qǐng)求數(shù)據(jù)原理探索

    本文將從簡(jiǎn)單到復(fù)雜,逐步剖析為什么?Fasthttp?選擇使用?slice?而非?map,并通過(guò)代碼示例解釋這一選擇背后高性能的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • Go 語(yǔ)言中程序編譯過(guò)程詳解

    Go 語(yǔ)言中程序編譯過(guò)程詳解

    本文旨在深入探討Go語(yǔ)言的編譯機(jī)制和最新的模塊管理系統(tǒng)——Go Modules,通過(guò)詳細(xì)的示例和步驟,我們將演示從簡(jiǎn)單的 “Hello World” 程序到使用第三方庫(kù)的更復(fù)雜項(xiàng)目的開發(fā)過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • GoLang語(yǔ)法之標(biāo)準(zhǔn)庫(kù)fmt.Printf的使用

    GoLang語(yǔ)法之標(biāo)準(zhǔn)庫(kù)fmt.Printf的使用

    fmt包實(shí)現(xiàn)了類似C語(yǔ)言printf和scanf的格式化I/O,主要分為向外輸出內(nèi)容和獲取輸入內(nèi)容兩大部分,本文就來(lái)介紹一下GoLang語(yǔ)法之標(biāo)準(zhǔn)庫(kù)fmt.Printf的使用,感興趣的可以了解下
    2023-10-10
  • 在Go中創(chuàng)建自定義錯(cuò)誤的方式總結(jié)

    在Go中創(chuàng)建自定義錯(cuò)誤的方式總結(jié)

    在程序開發(fā)中錯(cuò)誤處理是至關(guān)重要的,下面這篇文章主要給大家介紹了關(guān)于在Go中創(chuàng)建自定義錯(cuò)誤的方式,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Go具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • go?singleflight緩存雪崩源碼分析與應(yīng)用

    go?singleflight緩存雪崩源碼分析與應(yīng)用

    這篇文章主要為大家介紹了go?singleflight緩存雪崩源碼分析與應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之map的示例詳解

    Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之map的示例詳解

    哈希表是常見的數(shù)據(jù)結(jié)構(gòu),有的語(yǔ)言會(huì)將哈希稱作字典或者映射,在Go中,哈希就是常見的數(shù)據(jù)類型map,本文就來(lái)聊聊Golang中map的相關(guān)知識(shí)吧
    2023-04-04

最新評(píng)論