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