下面代码运行后,i和v打印出来的地址会发生变化吗?
package main import "fmt" func main() { nums := []int{10, 20, 30} for i, v := range nums { fmt.Printf("Index: %d, Index Address: %p,Value: %d, Value Address: %p\n", i, &i, v, &v) } }
直接看打印结果:
Index: 0, Index Address: 0xc0000d0010,Value: 10, Value Address: 0xc0000d0018 Index: 1, Index Address: 0xc0000d0010,Value: 20, Value Address: 0xc0000d0018 Index: 2, Index Address: 0xc0000d0010,Value: 30, Value Address: 0xc0000d0018
i和v只会在内存中存在一份,即每次遍历到的数据都以值覆盖的方式给了i和v,i和v的内存始终保持不变。
所以在for循环里开协程,不要直接把i和v的地址传给协程,可以使用一个临时变量来解决。