2016年12月1日 星期四

golang是用同樣的記憶體來存放 for range 取得的變數

在切片裡面走訪的時候,利用range所取出的變數,在記憶體中是同一個位置。不能利用此位置來區別切片裡的內容。例如:


package main

import (
 "fmt"
)

func main() {
 cars := []string{"toyota","honda","bmw"}

 for idx,car := range cars{

        fmt.Printf("car at:%p\n", &car)

        fmt.Printf("cars[%d] at:%p\n", idx,&cars[idx])
 }
}



https://play.golang.org/p/JuH5WdOw7q


這段程式碼跑的結果是這樣:

car at:0x1040a120
cars[0] at:0x10432200
car at:0x1040a120
cars[1] at:0x10432208
car at:0x1040a120
cars[2] at:0x10432210


每次從切片取出來的內容都是放到同一個 car。
因此不能利用car這個變數的位置來作為後續使用,而是要直接用idx索引 cars。



沒有留言: