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
}

執行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM