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...