婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 詳解Go語(yǔ)言中for range的坑

詳解Go語(yǔ)言中for range的坑

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

前言

Go 中的for range組合可以和方便的實(shí)現(xiàn)對(duì)一個(gè)數(shù)組或切片進(jìn)行遍歷,但是在某些情況下使用for range時(shí)很可能就會(huì)被"坑",下面用一段代碼來(lái)模擬下:

func main() {
  arr1 := []int{1, 2, 3}
  arr2 := make([]*int, len(arr1))

  for i, v := range arr1 {
    arr2[i] = v
  }

  for _, v := range arr2 {
    fmt.Println(*v)
  }
}

代碼解析:

  • 創(chuàng)建一個(gè)int slice,變量名為arr1并初始化 1,2,3 作為切片的值。
  • 創(chuàng)建一個(gè)*int slice,變量名為arr2。
  • 通過(guò)for range遍歷arr1,然后獲取每一個(gè)元素的指針,賦值到對(duì)應(yīng)arr2中。
  • 逐行打印arr2中每個(gè)元素的值。

從代碼上看,打印出來(lái)的結(jié)果應(yīng)該是

1
2
3

然而真正的結(jié)果是

3
3
3

原因

因?yàn)閒or range在遍歷值類型時(shí),其中的v變量是一個(gè)值的拷貝,當(dāng)使用獲取指針時(shí),實(shí)際上是獲取到v這個(gè)臨時(shí)變量的指針,而v變量在for range中只會(huì)創(chuàng)建一次,之后循環(huán)中會(huì)被一直重復(fù)使用,所以在arr2賦值的時(shí)候其實(shí)都是v變量的指針,而v最終會(huì)指向arr1最后一個(gè)元素的值拷貝。

來(lái)看看下面這個(gè)代碼,用for i來(lái)模擬for range,這樣更易于理解:

func main() {
  arr1 := []int{1, 2, 3}
  arr2 := make([]*int, len(arr1))

  var v int
  for i:=0;ilen(arr1);i++ {
    v = arr1[i]
    arr2[i] = v
  }

  for _, v := range arr2 {
    fmt.Println(*v)
  }
}

解決方案

傳遞原始指針

func main() {
  arr1 := []int{1, 2, 3}
  arr2 := make([]*int, len(arr1))

  for i := range arr1 {
    arr2[i] = arr1[i]
  }

  for _, v := range arr2 {
    fmt.Println(*v)
  }
}

使用臨時(shí)變量

func main() {
  arr1 := []int{1, 2, 3}
  arr2 := make([]*int, len(arr1))

  for i, v := range arr1 {
    t := v
    arr2[i] = t
  }

  for _, v := range arr2 {
    fmt.Println(*v)
  }
}

使用閉包

func main() {
  arr1 := []int{1, 2, 3}
  arr2 := make([]*int, len(arr1))

  for i, v := range arr1 {
    func(v int){
       arr2[i] = v
    }(v)
  }

  for _, v := range arr2 {
    fmt.Println(*v)
  }
}

官方提示

由于這一問(wèn)題過(guò)于普遍,Golang甚至將其寫入了文檔的『常見錯(cuò)誤』部分:文檔

到此這篇關(guān)于詳解Go語(yǔ)言中for range的"坑"的文章就介紹到這了,更多相關(guān)Go語(yǔ)言for range內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang中for range的取地址操作陷阱介紹
  • Go語(yǔ)言for range(按照鍵值循環(huán))遍歷操作
  • go for range遍歷二維數(shù)組的示例
  • go for range坑和閉包坑的分析
  • go實(shí)現(xiàn)for range迭代時(shí)修改值的操作

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Go語(yǔ)言中for range的坑》,本文關(guān)鍵詞  詳解,語(yǔ),言中,for,range,的坑,;如發(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語(yǔ)言中for range的坑》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于詳解Go語(yǔ)言中for range的坑的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 资源县| 富川| 原平市| 吴川市| 毕节市| 福州市| 印江| 张家口市| 东莞市| 德令哈市| 个旧市| 商都县| 新河县| 宁远县| 德江县| 大足县| 突泉县| 墨脱县| 堆龙德庆县| 达州市| 荆州市| 郎溪县| 乌拉特后旗| 历史| 龙州县| 农安县| 军事| 广饶县| 五台县| 长丰县| 舒兰市| 沙洋县| 沈阳市| 华容县| 通渭县| 礼泉县| 柳江县| 曲阜市| 祁阳县| 安图县| 大埔县|