golang 對slice的深拷貝 copy

2021-09-07 17:31:39 字數 1529 閱讀 2738

測試 slice的位址 copy的時候 發現有問題:

package main

import "fmt"

func main()

fmt.println(" len cap address")

fmt.print("111---",len(nums),cap(nums))

fmt.printf(" %p\n",nums)//0xc4200181e0

a:=nums[:3]

fmt.print("222---",len(a),cap(a))

fmt.printf(" %p\n",a)//0xc4200181e0 一樣

//output: 222--- 3 5

b:=nums[:3:3] //第二個冒號 設定cap的

n:=copy(b,nums[:3:3]) //第二個冒號 設定cap的

fmt.print("333---",len(b),cap(b))

fmt.printf(" %p\n",b)//0xc4200181e0 一樣

//output: 333--- 3 3

fmt.println(n,b)

nums[0]=55

fmt.println(nums,a,b)

}

發現 nums[0]修改了資料後,其他全部都改變了,並且位址都一樣,想了想 到底**出了問題呢? 是 copy 的問題?

len cap   address

111---5 5 0xc4200181e0

222---3 5 0xc4200181e0

333---3 3 0xc4200181e0

3 [1 2 3]

[55 2 3 4 5] [55 2 3][55 2 3]

琢磨了一下,發現 原來是copy前的物件 沒有分配記憶體,使用了一樣的記憶體位址導致的,把上文的

b:=nums[:3:3] //第二個冒號 設定cap的

修改為:

var b =make(int,len(nums[:3:3]))

再進行copy 結果就如語氣了,b的值不會被修改了。

len cap   address

111---5 5 0xc4200181e0

222---3 5 0xc4200181e0

333---3 3 0xc42000a400

3 [1 2 3]

[55 2 3 4 5] [55 2 3] [1 2 3]

其實研究明白了,都是小問題;

golang深拷貝任意結構**:

// clone 完整複製資料

func clone(a, b inte***ce{}) error

if err := dec.decode(b); err != nil

return nil

}

```

使用slice和concat對陣列的深拷貝和淺拷貝

本文 一 陣列淺拷貝 在使用j ascript對陣列進行操作的時候,我們經常需要將陣列進行備份.如下 如果只是簡單才用賦值的方法,那麼我們只要更改其中的任何乙個,然後其他的也會跟著改變,這就導致了問題的發生 var arr1 red yellow black var arr2 arr1 arr2 1...

golang中 指標or結構體 的值拷貝 深拷貝

我們先宣告乙個狗狗的結構體 type dog struct 重寫string介面 func dog dog string string 第一種 結構體的普通宣告及值拷貝,可以看到輸出的時候並沒有用到string 畢竟不是指標 func main d2 d1 值拷貝 d1.name 小喵 fmt.pr...

分析golang的slice排序

今天寫 牽扯到給乙個slice排序的問題,發現go的sort包裡支援自定義排序,果斷拿來用了。sort.slice pricelist,func i,j int bool 上面這個是使用sort.slice 的例子。在此之前,先講講基礎的sort方法,type inte ce inte ce fun...