for range 复制行为
复制要么复制指针,要么复制完整的对象,Go 语言影响最大的是数组。
func rangeCopy() {
x := [4]int{0x11, 0x22, 0x33, 0x44}
for _, n := range x {
// 遍历输出
println(n)
}
for i, n := range x {
// 遍历每次修改值
x[0], x[1], x[2], x[3] = 0x100, 0x200, 0x300, 0x400
fmt.Printf("%d: n=%#x, x[%d] = %#x\n", i, n, i, x[i])
}
for i, n := range x[:] {
x[0], x[1], x[2], x[3] = 0x100, 0x200, 0x300, 0x400
fmt.Printf("%d: n=%#x, x[%d] = %#x\n", i, n, i, x[i])
}
}
同样遍历数组,但是每次重新修改值,一般人会认为既然修改了,每次遍历出来x的值应该是修改后的值,实际上不是。
我们遍历依然是原始的值,修改并没有影响遍历。所以range x
实际上执行了一次range x.copy()