Golang Range關鍵字的秘密

Go 語言中 range 關鍵字用于 for 循環(huán)中迭代,支持類型如下:

  • 數組(array)
  • 切片(slice)
  • 通道(channel)
  • 集合(map)
    它返回元素的索引和索引對應的值,在集合中返回 key-value 對的 key 值。

使用起來非常方便

for index, value := range myArray {
    fmt.Println("index: " + index)
    fmt.Println("value: " + value)
}

這個簡單的使用方法里面,對新手來說,還是有坑的,而且非常不容易被發(fā)現。

package main

import "fmt"

type student struct {
    Name string
    Age  int
}

func main() {
    var stus []student
    stus = []student{
        {Name: "one", Age: 18},
        {Name: "two", Age: 19},
    }
    data := make(map[int]*student)

    // code1 這是不對的使用方法
    for i, v := range stus {
        data[i] = &v
    }
    for i, v := range data {
        fmt.Printf("error: key=%d, value=%v \n", i, *v)
    }

    // code2 這是正確的使用方法
    for i, _ := range stus {
        data[i] = &stus[i]
    }
    for i, v := range data {
        fmt.Printf("right: key=%d, value=%v \n", i, *v)
    }
}

輸出結果是:

error: key=0, value={two 19}
error: key=1, value={two 19}
right: key=0, value={one 18}
right: key=1, value={two 19}

原因很明顯:
用for range來遍歷的時候,被遍歷的指針是不變的,每次遍歷僅執(zhí)行struct值的拷貝,即上面代碼中的變遍歷的 [v] 是對struct的值拷貝,因此 code1中 data[i] = &v 永遠取的值都是 v這個遍歷的地址。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,246評論 0 38
  • 轉載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,473評論 1 5
  • 簡直是非常無理取鬧的天氣。早晨一起身,又是霧雨蒙蒙?;谢秀便憋h飄蕩蕩的宇宙天空,游在一團優(yōu)柔寡斷的茫茫水汽里。冬天...
    袁森林閱讀 339評論 0 1
  • 長憶湘冮,假日閑來踏白沙,蘆花一處兩三鴨,炊煙裊人家。 那時花開月正圓,青春戀愛慢慢談。 別來幾回夢中向,相見復相...
    半步天閱讀 337評論 2 24
  • 清楚認識項目經理在項目不同時期所起到的作用,定義正確角色。 規(guī)劃者 為獲得目成功,要確保恰當全面的定義整個項目,所...
    信安高項未來星閱讀 3,753評論 0 0

友情鏈接更多精彩內容