首頁 >後端開發 >Golang >為什麼在 Go 中複製到空目標切片時 `copy()` 返回空切片?

為什麼在 Go 中複製到空目標切片時 `copy()` 返回空切片?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-16 09:14:14738瀏覽

Why Does `copy()` Return an Empty Slice When Copying to an Empty Destination Slice in Go?

為什麼使用copy() 複製空切片會導致空切片

在Go 中使用切片時,copy() 函數通常用於建立現有切片的副本。但是,如果目標切片為空,則複製操作會出現意外行為。

根據 copy() 的文件:

The copy built-in function copies elements from a source slice into a destination slice. (As a special case, it also will copy bytes from a string to a slice of bytes.) The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).

這表示複製的元素數量應該是來源切片和目標切片的長度的最小值。但是,當目標切片為空時(如範例中 tmp 初始化為空切片),不會複製任何元素。

此行為的原因在於 copy() 的實作。此函數迭代來源切片並將元素複製到目標切片,直到到達來源切片或目標切片的末端。如果目標切片為空,則循環將立即結束,因為沒有要複製的元素。

要建立切片的非空副本,必須使用非零長度初始化目標切片。這可以使用make() 函數來實現,如下例所示:

arr := []int{1, 2, 3}
tmp := make([]int, len(arr))
copy(tmp, arr)

fmt.Println(tmp) // Output: [1 2 3]

透過明確設定目標切片的長度,我們確保copy() 有足夠的空間來複製所有切片來自來源切片的元素。此行為也記錄在 Go 語言規範中,其中規定複製的元素數量是來源切片和目標切片長度中的最小值。

因此,當嘗試使用 copy( 複製空切片時),使用非零長度初始化目標切片非常重要,以確保複製操作成功。

以上是為什麼在 Go 中複製到空目標切片時 `copy()` 返回空切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn