go語言坑之for range

2021-09-10 21:34:05 字數 1381 閱讀 1130

songleo 關注

go只提供了一種迴圈方式,即for迴圈,在使用時可以像c那樣使用,也可以通過for range方式遍歷容器型別如陣列、切片和對映。但是在使用for range時,如果使用不當,就會出現一些問題,導致程式執行行為不如預期。比如,下面的示例程式將遍歷乙個切片,並將切片的值當成對映的鍵和值存入,切片型別是乙個int型,對映的型別是鍵為int型,值為*int,即值是乙個位址。

package main

import "fmt"

func main()

mymap := make(map[int]*int)

for index, value := range slice

fmt.println("*****new map*****")

prtmap(mymap)

}func prtmap(mymap map[int]*int)

}

執行程式輸出如下:

*****new map*****

map[3]=3

map[0]=3

map[1]=3

map[2]=3

由輸出可以知道,不是我們預期的輸出,正確輸出應該如下:

*****new map*****

map[0]=0

map[1]=1

map[2]=2

map[3]=3

但是由輸出可以知道,對映的值都相同且都是3。其實可以猜測對映的值都是同乙個位址,遍歷到切片的最後乙個元素3時,將3寫入了該位址,所以導致對映所有值都相同。其實真實原因也是如此,因為for range建立了每個元素的副本,而不是直接返回每個元素的引用,如果使用該值變數的位址作為指向每個元素的指標,就會導致錯誤,在迭代時,返回的變數是乙個迭代過程中根據切片依次賦值的新變數,所以值的位址總是相同的,導致結果不如預期。

修正後程式如下:

package main

import "fmt"

func main()

mymap := make(map[int]*int)

for index, value := range slice

fmt.println("*****new map*****")

prtmap(mymap)

}func prtmap(mymap map[int]*int)

}

執行程式輸出如下:

*****new map*****

map[2]=2

map[3]=3

map[0]=0

map[1]=1

go語言坑之for range

songleo 關注 go只提供了一種迴圈方式,即for迴圈,在使用時可以像c那樣使用,也可以通過for range方式遍歷容器型別如陣列 切片和對映。但是在使用for range時,如果使用不當,就會出現一些問題,導致程式執行行為不如預期。比如,下面的示例程式將遍歷乙個切片,並將切片的值當成對映的...

go語言for range 鍵值迴圈

go 語言可以使用 for range 遍歷陣列 切片 字串 map 及通道 channel 通過 for range 遍歷的返回值有一定的規律 for key,value range intgo 語言和其他語言類似,可以通過 for range 的組合,對字串進行遍歷,遍歷時,key 和 valu...

Go語言for range(按照鍵值迴圈)遍歷

go 語言可以使用 for range 遍歷陣列 切片 字串 map 及通道 channel 通過 for range 遍歷的返回值有一定的規律 陣列 切片 字串返回索引和值。map 返回鍵和值。通道 channel 只返回通道內的值。遍歷陣列 切片 獲得索引和元素 在遍歷 中,key 和 valu...