go语言的坑:切片的拷贝问题
在go语言中的切片变量其实就是一个地址,我们先来看一段代码:
func test_arr() { a := []int{1, 2, 3} var c [][]int b := a c = append(c, b) c = append(c, b) fmt.Println(c) c[0][0] = 9 fmt.Println(c) fmt.Println(a) change(a) fmt.Println(c) fmt.Println(b) } func change(cp []int) { cp[0] = 6 }
输出结果如下:
我们不难发现,在上面代码中,并不需要传递切片a的地址,就可以修改a中的值。在这种情况下,如果要拷贝一个新的切片对象的话,就需要使用go语言官方提供的一个内置函数copy(copy_slice,src_slice)。
使用示例:
func test_arr() { a := []int{1, 2, 3} var c [][]int b := make([]int, len(a)) //使用copy函数必须复制切片的结构必须和源数据结构一致 copy(b, a) c = append(c, b) c = append(c, b) fmt.Println(c) c[0][0] = 9 fmt.Println(c) fmt.Println(a) change(a) fmt.Println(c) fmt.Println(b) } func change(cp []int) { cp[0] = 6 }
执行结果: