Golang中range的使用方法及注意事项

马谦的博客 ·
在对slice进行range的时候,其实每一次都是进行了深拷贝的, 若不进行深拷贝,切片b的输出结果应该为{200,300,103} ``` package main import "fmt" func main() { a := [3]int{1, 2, 3} b := []int{1, 2, 3} for k, v := range a {//v只获取到了a数组中的值 if k == 0 { a[0], a[1] = 100, 200 fmt.Printf("k:%v a:%v\n", k, a) } a[k] = 100 + v } for k, v := range b {//每一次循环v是对b[k]的深拷贝 ,这样才可以解释{101,200,103}的输出结果 if k == 0 { b[0], b[1] = 100, 200 fmt.Printf("k:%v b:%v\n", k, b) } b[k] = 100 + v } fmt.Printf("a: %v\n b: %v\n", a, b) } ``` 输出结果为: ``` k:0 a:[100 200 3] k:0 b:[100 200 3] a: [101 102 103] b: [101 300 103] ```
#1
更多评论
切片不是深拷贝,你的例子只表明 range 数组时一下子把所有值都读取了,而range 切片时是一次循环读一个。 详细的说,数组时 v的值依次是 1,2,3 ,而切片时 v的值依次是 1 200 3. ```go package main import ( "fmt" ) func main() { type temp struct { field1 string field2 int } temps := []*temp{ { field1: "a", field2: 1, }, { field1: "b", field2: 2, }, { field1: "c", field2: 3, }, } for _, v := range temps { v.field2 = 4 } fmt.Printf("%v %v %v", *temps[0], *temps[1], *temps[2])//{a 4} {b 4} {c 4} } temps2 := []map[int]string{ map[int]string{1: "a"}, {2: "b"}, {3: "c"}, } for _, v := range temps2 { v[4] = "d" } fmt.Printf("%v",temps2)//[map[1:a 4:d] map[2:b 4:d] map[3:c 4:d]] 对v更改后temps2 也被更改了 ```
#2