Golang range 的一些坑
先舉個栗子:
package main import ( "fmt" ) type Foo struct { Bar string } func main() { list := []Foo{Foo{"bar1"}, Foo{"bar2"}, Foo{"bar3"}} for i, v := range list { v.Bar = "change" + string(i) } fmt.Println(list) }
我們期望的結果是
[{change1} {change2} {change3}]
但是實際輸出的結果是
[{test1} {test2} {test3}]
為什麼沒有改變? 其實 for range 中的 v 是一個數組元素值的拷貝, 而不是陣列元素本身。所以,修改陣列元素需要使用下標進行修改。栗子中 for range 修改成
for i, _ := range list { list[i].Bar = "change" + string(i) }
小考題:
package main import ( "fmt" ) func main() { a := []int{1, 2, 3} for _, v := range a { fmt.Println(&v) } }
上面程式碼每次輸出是否是一樣?
答案:是一樣的。
解析:for range 中的 v 只會宣告初始化一次,不會每次迴圈都宣告初始化。