在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
}
执行结果:
