」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 Go 中向同一數組中的切片追加內容時會發生變數覆蓋?

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

發佈於2024-11-10
瀏覽:234

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

解決方案:

要避免這種覆蓋,您需要確保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)
}
版本聲明 本文轉載於:1729727920如有侵犯,請洽[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3