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
}

  

輸出結果以下:app

咱們不難發現,在上面代碼中,並不須要傳遞切片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
}

執行結果:blog

相關文章
相關標籤/搜索