在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
}
執行結果:

