亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我不能用 `copy()` 復制切片?

為什么我不能用 `copy()` 復制切片?

Go
qq_遁去的一_1 2021-10-04 17:18:41
我需要在 Go 中制作一個切片的副本并閱讀文檔,我可以使用復制功能。copy 內置函數將元素從源切片復制到目標切片。(作為一種特殊情況,它還會將字節從字符串復制到字節切片。)源和目標可能重疊。Copy 返回復制的元素數,這將是 len(src) 和 len(dst) 中的最小值。但是當我這樣做時:arr := []int{1, 2, 3}tmp := []int{}copy(tmp, arr)fmt.Println(tmp)fmt.Println(arr)我tmp的和以前一樣是空的(我什至嘗試使用arr, tmp):[][1 2 3]你可以在 go playground上查看。那么為什么我不能復制切片呢?
查看完整描述

3 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

內置copy(dst, src)復制min(len(dst), len(src))元素。


因此,如果您的dst值為空 ( len(dst) == 0),則不會復制任何內容。


嘗試tmp := make([]int, len(arr))(去游樂場):


arr := []int{1, 2, 3}

tmp := make([]int, len(arr))

copy(tmp, arr)

fmt.Println(tmp)

fmt.Println(arr)

輸出(如預期):


[1 2 3]

[1 2 3]

不幸的是,這在builtin包中沒有記錄,但在Go Language Specification: Appending to and copying slices 中有記錄:


復制的元素的數目是最小len(src)和len(dst)。


編輯:


最后,文檔copy()已更新,現在包含將復制源和目標的最小長度的事實:


Copy 返回復制的元素數,這將是len(src) 和 len(dst) 中的最小值。


查看完整回答
反對 回復 2021-10-04
?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

如果您的切片大小相同,它將起作用:


arr := []int{1, 2, 3}

tmp := []int{0, 0, 0}

i := copy(tmp, arr)

fmt.Println(i)

fmt.Println(tmp)

fmt.Println(arr)

會給:


3

[1 2 3]

[1 2 3]

來自“ Go Slices:用法和內部結構”:


復制功能支持在不同長度的切片之間進行復制(它只會復制到較少數量的元素)


通常的例子是:


t := make([]byte, len(s), (cap(s)+1)*2)

copy(t, s)

s = t


查看完整回答
反對 回復 2021-10-04
  • 3 回答
  • 0 關注
  • 279 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號