首頁 > 後端開發 > Golang > 為什麼 Go 中向同一數組中的切片追加內容時會發生變數覆蓋?

為什麼 Go 中向同一數組中的切片追加內容時會發生變數覆蓋?

Mary-Kate Olsen
發布: 2024-10-24 08:11:01
原創
467 人瀏覽過

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

Go 中變數覆蓋的原因

您的程式碼遇到變數覆蓋問題,因為您透過將元素附加到同一後備數組來建立新切片(pathA 和pathB)

Go 中切片的背景:

  • Go 切片是一種資料結構,表示連續的元素區塊相同類型。
  • 切片有長度(目前儲存的元素數量)和容量(可以容納的最大元素數量)。
  • 修改切片時,可能會觸發如果超出容量,則分配新的後備數組。

您的程式碼有問題:

在您的程式碼中,您正在建立兩個新切片,pathA 和pathB,使用追加函數:

pathA := append(route, nextA)
pathB := append(route, nextB)
登入後複製

發生的情況如下:

  1. 最初,路線的容量可以容納nextA 和nextB。因此,使用與路由相同的後備數組建立兩個新切片(pathA 和 pathB)。
  2. 隨著循環的進行並且繼續追加到路由,其容量最終會超過其長度。
  3. 在循環的後續迭代中,為路由分配一個新的後備數組。但是,pathA 和 pathB 仍然引用舊的後備數組。
  4. 當您將 nextB 附加到路由時,它會寫入舊後備數組的最後一個元素,該元素由 pathA 和 pathB 共用。
  5. 因此,pathA 和 pathB 的最終值相同。

解:

要避免這種覆蓋,您需要確保 pathA 和 pathB 具有唯一的後備數組。您可以透過使用 make 和 copy 為其中一個手動建立一個新切片來實現此目的:

newRoute := make([]int, len(route), (cap(route)+1)*2)
copy(newRoute, route)
if i % 2 == 0 {
    pathA := append(newRoute, nextA)
} else {
    pathB := append(newRoute, nextB)
}
登入後複製

以上是為什麼 Go 中向同一數組中的切片追加內容時會發生變數覆蓋?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板