在go里面有数组类型和切片类型,切片其实是一个数据结构,封装了数组,提供动态数组的特性。 在使用range语法糖的时候, range数组:会导致提前复制该数组,然后遍历的都是之前的原始值。 range切片:是浅拷贝,拷贝的是该数据结构,共享的是同一个底层数组。
package main import "fmt" func main() { a := [3]int{1, 2, 3} b := []int{1, 2, 3} //数组range是会复制一个完整副本 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 fmt.Printf("k:%v a:%v v:%v\n", k, a,v) } //切片range,共享同一个底层数组 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 v:%v\n", k, b,v) } b[k] = 100 + v fmt.Printf("k:%v b:%v v:%v\n", k, b,v) } fmt.Printf("a: %v\n b: %v\n", a, b) }