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

主頁 > 知識庫 > 詳解Go語言中for range的坑

詳解Go語言中for range的坑

熱門標簽:賺地圖標注的錢犯法嗎 澳門防封電銷卡 廣東語音外呼系統供應商 智能電銷機器人營銷 長沙ai機器人電銷 烏魯木齊人工電銷機器人系統 福州鐵通自動外呼系統 地圖標注測試 濮陽自動外呼系統代理

前言

Go 中的for range組合可以和方便的實現對一個數組或切片進行遍歷,但是在某些情況下使用for range時很可能就會被"坑",下面用一段代碼來模擬下:

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)
  }
}

代碼解析:

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

從代碼上看,打印出來的結果應該是

1
2
3

然而真正的結果是

3
3
3

原因

因為for range在遍歷值類型時,其中的v變量是一個值的拷貝,當使用獲取指針時,實際上是獲取到v這個臨時變量的指針,而v變量在for range中只會創建一次,之后循環中會被一直重復使用,所以在arr2賦值的時候其實都是v變量的指針,而v最終會指向arr1最后一個元素的值拷貝。

來看看下面這個代碼,用for 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)
  }
}

使用臨時變量

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)
  }
}

官方提示

由于這一問題過于普遍,Golang甚至將其寫入了文檔的『常見錯誤』部分:文檔

到此這篇關于詳解Go語言中for range的"坑"的文章就介紹到這了,更多相關Go語言for range內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

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

標簽:慶陽 廣西 調研邀請 阿克蘇 西雙版納 太原 德州 貴陽

巨人網絡通訊聲明:本文標題《詳解Go語言中for range的坑》,本文關鍵詞  詳解,語,言中,for,range,的坑,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解Go語言中for range的坑》相關的同類信息!
  • 本頁收集關于詳解Go語言中for range的坑的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 福贡县| 昭平县| 瑞丽市| 宁夏| 温泉县| 玉屏| 巴南区| 舞阳县| 清河县| 安义县| 淳安县| 北流市| 东辽县| 昌邑市| 格尔木市| 新蔡县| 岳普湖县| 大丰市| 多伦县| 彭水| 资溪县| 西乌珠穆沁旗| 九龙坡区| 会泽县| 华蓥市| 辽源市| 磐石市| 绿春县| 托克托县| 安化县| 图木舒克市| 叙永县| 济源市| 兴城市| 浏阳市| 元氏县| 宁晋县| 乐山市| 清丰县| 武胜县| 游戏|