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

詳解Go語言中for range的"坑"

 更新時間:2020年09月29日 09:08:03   作者:mokeyWie  
這篇文章主要介紹了詳解Go語言中for range的"坑",文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

Go 中的for range組合可以和方便的實現(xiàn)對一個數(shù)組或切片進行遍歷,但是在某些情況下使用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)
  }
}

代碼解析:

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

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

1
2
3

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

3
3
3

原因

因為for range在遍歷值類型時,其中的v變量是一個值的拷貝,當使用&獲取指針時,實際上是獲取到v這個臨時變量的指針,而v變量在for range中只會創(chuàng)建一次,之后循環(huán)中會被一直重復(fù)使用,所以在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;i<len(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甚至將其寫入了文檔的『常見錯誤』部分:文檔

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

相關(guān)文章

  • 淺談Golang的方法傳遞值應(yīng)該注意的地方

    淺談Golang的方法傳遞值應(yīng)該注意的地方

    這篇文章主要介紹了淺談Golang的方法傳遞值應(yīng)該注意的地方,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go語言channel實現(xiàn)多核并行化運行的方法

    go語言channel實現(xiàn)多核并行化運行的方法

    這篇文章主要介紹了go語言channel實現(xiàn)多核并行化運行的方法,實例分析了channel實現(xiàn)多核并行化運行的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • golang flag介紹和使用示例

    golang flag介紹和使用示例

    本文主要介紹了Go語言中flag包的使用方法,詳細闡述了基本概念及常用函數(shù),并通過示例代碼進行了具體演示,總結(jié)中指出,flag包提供了一種方便的方式來處理命令行參數(shù),可定義不同類型的標志,并在解析后使用這些參數(shù)
    2024-10-10
  • Go?net?http超時應(yīng)用場景全面詳解

    Go?net?http超時應(yīng)用場景全面詳解

    HTTP是一個復(fù)雜的多階段協(xié)議,因此沒有一個一刀切的超時解決方案,在這篇文章中,我將分解您可能需要應(yīng)用超時的各個階段,并研究在服務(wù)器端和客戶端上執(zhí)行超時的不同方法
    2024-01-01
  • Go?gRPC服務(wù)雙向流式RPC教程

    Go?gRPC服務(wù)雙向流式RPC教程

    這篇文章主要為大家介紹了Go?gRPC服務(wù)雙向流式RPC教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • go?singleflight緩存雪崩源碼分析與應(yīng)用

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

    這篇文章主要為大家介紹了go?singleflight緩存雪崩源碼分析與應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Go語言之io.ReadAtLeast函數(shù)的基本使用和原理解析

    Go語言之io.ReadAtLeast函數(shù)的基本使用和原理解析

    io.ReadAtLeast函數(shù)是Go語言標準庫提供的一個工具函數(shù),能夠從數(shù)據(jù)源讀取至少指定數(shù)量的字節(jié)數(shù)據(jù)到緩沖區(qū)中,這篇文章主要介紹了io.ReadAtLeast函數(shù)的相關(guān)知識,需要的朋友可以參考下
    2023-07-07
  • golang抓取tcp包的實現(xiàn)方式

    golang抓取tcp包的實現(xiàn)方式

    使用`golang`的`packet`和`pcap`庫可以抓取TCP數(shù)據(jù)包,首先,確保安裝了`pcap`庫,然后使用以下代碼打開網(wǎng)絡(luò)接口,設(shè)置過濾規(guī)則為“tcp”,開始捕獲并解析TCP數(shù)據(jù)包,運行代碼時需要管理員權(quán)限
    2024-12-12
  • Golang中Map按照Value大小排序的方法實例

    Golang中Map按照Value大小排序的方法實例

    這篇文章主要給大家介紹了關(guān)于Golang中Map按照Value大小排序的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • Go初學(xué)者踩坑之go?mod?init與自定義包的使用

    Go初學(xué)者踩坑之go?mod?init與自定義包的使用

    go?mod是go的一個模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于Go初學(xué)者踩坑之go?mod?init與自定義包的使用,需要的朋友可以參考下
    2022-10-10

最新評論

阳泉市| 文登市| 舞钢市| 六盘水市| 平远县| 清苑县| 高安市| 呼和浩特市| 财经| 广水市| 柳河县| 商河县| 德庆县| 囊谦县| 淮南市| 赣榆县| 安吉县| 大安市| 新民市| 晋州市| 平罗县| 治多县| 西昌市| 咸丰县| 公主岭市| 赣州市| 扎鲁特旗| 吉林市| 阿瓦提县| 陇南市| 留坝县| 周口市| 白城市| 青铜峡市| 江华| 平果县| 西乌珠穆沁旗| 蓝山县| 焉耆| 射洪县| 济阳县|