最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Go中Map類型和Slice類型的傳遞

 更新時(shí)間:2017年11月05日 11:03:37   作者:snowInPluto  
這篇文章主要為大家詳細(xì)介紹了Go中Map類型和Slice類型的傳遞,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

關(guān)于 Go 中 Map 類型和 Slice 類型的傳遞

Map 類型

先看例子 m1:

func main() {
  m := make(map[int]int)
  mdMap(m)
  fmt.Println(m)
}

func mdMap(m map[int]int) {
  m[1] = 100
  m[2] = 200
}

結(jié)果是

map[2:200 1:100]

我們?cè)傩薷娜缦?m2:

func main() {
  var m map[int]int
  mdMap(m)
  fmt.Println(m)
}

func mdMap(m map[int]int) {
  m = make(map[int]int)
  m[1] = 100
  m[2] = 200
}

發(fā)現(xiàn)結(jié)果變成了

map[]

要理解這個(gè)問(wèn)題,需要明確在 Go 中不存在引用傳遞,所有的參數(shù)傳遞都是值傳遞。

現(xiàn)在再來(lái)分析下,如圖:

可能有些人會(huì)有疑問(wèn),為什么途中的 m 像是一個(gè)指針呢。查看官方的 Blog 中有寫(xiě):

Map types are reference types, like pointers or slices, ...

這邊說(shuō) Map 類型是引用類型,像是指針或是 Slice(切片)。所以我們基本上可以把它當(dāng)作是指針來(lái)看待(注意,只是近似,或者說(shuō)其中含有指針,其內(nèi)部仍然含有其他信息,這里只是為了便于理解),只不過(guò)這個(gè)指針有些特殊罷了。

m1 中,當(dāng)調(diào)用 mdMap 方法時(shí)重新開(kāi)辟了內(nèi)存,將 m 的內(nèi)容,也就是 map 的地址拷貝入了 m',所以此時(shí)當(dāng)操作 map 時(shí),m 和 m' 所指向的內(nèi)存為同一塊,就導(dǎo)致 m 的 map 發(fā)生了改變。

而在 m2 中,在調(diào)用 mdMap 之前,m 并未分配內(nèi)存,也就是說(shuō)并未指向任何的 map 內(nèi)存區(qū)域。從未導(dǎo)致 m' 的 map 修改不能反饋到 m 上。

Slice 類型

現(xiàn)在看一下 Slice。

s1:

func main() {
  s := make([]int, 2)
  mdSlice(s)
  fmt.Println(s)
}

func mdSlice(s []int) {
  s[0] = 1
  s[1] = 2
}

s2:

func main() {
  var s []int
  mdSlice(s)
  fmt.Println(s)
}

func mdSlice(s []int) {
  s = make([]int, 2)
  s[0] = 1
  s[1] = 2
}

不出所料:

s1 結(jié)果為

[1 2]

s2 為

[]

因?yàn)檎绻俜剿f(shuō),Slice 類型與 Map 類型一樣,類似于指針,Slice 中仍然含有長(zhǎng)度等信息。

修改一下 s1,變成 s3:

func main() {
  s := make([]int, 2)
  mdSlice(s)
  fmt.Println(s)
}

func mdSlice(s []int) {
  s = append(s, 1)
  s = append(s, 2)
}

不再修改 slice 原先的兩個(gè)元素,而加上另外兩個(gè),結(jié)果為:

[0 0]

發(fā)現(xiàn)修改并沒(méi)有反饋到原先的 slice 上。

這里我們需要把 slice 想象為特殊的指針,其已經(jīng)保存了所指向內(nèi)存區(qū)域長(zhǎng)度,所以 append 之后的內(nèi)存并不會(huì)反映到 main() 中:

那如何才能反映到 main() 中呢?沒(méi)錯(cuò),使用指向 Slice 的指針。

func mdSlice(s *[]int) {
  *s = append(*s, 1)
  *s = append(*s, 2)
}

內(nèi)存如圖所示:

注意本文中內(nèi)存區(qū)域分配是否連續(xù)完全隨機(jī),不影響程序,只是為了圖解清晰。

Chan 類型

Go 中 make 函數(shù)能創(chuàng)建的數(shù)據(jù)類型就 3 類:Slice, Map, Chan。不比多說(shuō),相比讀者已經(jīng)能想象 Chan 類型的內(nèi)存模型了。的確如此,讀者可以自己嘗試,這邊就不過(guò)多贅述了。(可以通通過(guò) == nil 的比較來(lái)進(jìn)行測(cè)試)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • golang中命令行庫(kù)cobra的使用方法示例

    golang中命令行庫(kù)cobra的使用方法示例

    這篇文章主要給大家介紹了關(guān)于golang中命令行庫(kù)cobra的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • golang中的io.ReadCloser與ioutil.NopCloser使用

    golang中的io.ReadCloser與ioutil.NopCloser使用

    這篇文章主要介紹了golang中的io.ReadCloser與ioutil.NopCloser使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Golong字符串拼接性能優(yōu)化及原理介紹

    Golong字符串拼接性能優(yōu)化及原理介紹

    最近在做性能優(yōu)化,有個(gè)函數(shù)里面的耗時(shí)特別長(zhǎng),看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其實(shí)有很多種實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Golang語(yǔ)言如何高效拼接字符串的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 淺析Go中fasthttp與net/http的性能對(duì)比及應(yīng)用

    淺析Go中fasthttp與net/http的性能對(duì)比及應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了Golang中fasthttp的底層實(shí)現(xiàn)以及與net/http的區(qū)別,下面就跟隨小編一起來(lái)看看fasthttp到底是如何做到性能如此之快的吧
    2024-03-03
  • Go語(yǔ)言func匿名函數(shù)閉包示例詳解

    Go語(yǔ)言func匿名函數(shù)閉包示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言func匿名函數(shù)閉包示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之指針詳解

    Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之指針詳解

    Go 語(yǔ)言中指針是很容易學(xué)習(xí)的,Go 語(yǔ)言中使用指針可以更簡(jiǎn)單的執(zhí)行一些任務(wù)。所以本文就來(lái)和大家聊聊Go語(yǔ)言中指針的定義與使用,需要的可以參考一下
    2022-12-12
  • 詳解golang中接口使用的最佳時(shí)機(jī)

    詳解golang中接口使用的最佳時(shí)機(jī)

    接口在系統(tǒng)設(shè)計(jì)中,以及代碼重構(gòu)優(yōu)化中,是一個(gè)不可或缺的工具,能夠幫助我們寫(xiě)出可擴(kuò)展,可維護(hù)性更強(qiáng)的程序,本文主要為大家介紹一下golang中接口使用的最佳時(shí)機(jī),有興趣的可以了解下
    2023-09-09
  • Go語(yǔ)言排序算法:快速、可靠的排序解決方案

    Go語(yǔ)言排序算法:快速、可靠的排序解決方案

    Go語(yǔ)言提供了多種快速、可靠的排序算法,可以滿足不同場(chǎng)景下的排序需求,其中最常用的排序算法包括快速排序、歸并排序和堆排序,需要的朋友可以參考下
    2023-10-10
  • Go json反序列化“null“的問(wèn)題解決

    Go json反序列化“null“的問(wèn)題解決

    本文主要介紹了Go json反序列化“null“的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • go將request?body綁定到不同的結(jié)構(gòu)體中教程

    go將request?body綁定到不同的結(jié)構(gòu)體中教程

    這篇文章主要為大家介紹了go將request?body綁定到不同的結(jié)構(gòu)體中教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論

乌拉特中旗| 绥宁县| 五莲县| 名山县| 襄垣县| 灌云县| 汝阳县| 吉水县| 鄱阳县| 克什克腾旗| 邹平县| 宝兴县| 蓬溪县| 恩施市| 永兴县| 宣城市| 密云县| 隆昌县| 五常市| 纳雍县| 响水县| 九龙坡区| 永德县| 枞阳县| 民乐县| 西华县| 治多县| 和龙市| 秦安县| 嘉善县| 清镇市| 怀柔区| 闽侯县| 赤壁市| 文安县| 喜德县| 区。| 忻州市| 嘉兴市| 东平县| 东兰县|