首頁  >  文章  >  後端開發  >  為什麼 Go 變數會被覆蓋?

為什麼 Go 變數會被覆蓋?

Patricia Arquette
Patricia Arquette原創
2024-10-24 07:54:30791瀏覽

Why are Go Variables Being Overwritten?

Go 變數被覆蓋

在Go 例程中,使用者報告了一個問題,即在設定另一個變數時,一個變數被覆蓋。具體來說,使用者建立了兩個名為pathA和pathB的整數列表。當用三角形的新值擴展路徑A時,它最初設定正確,但後來被路徑B覆蓋。

調查

問題是由於共享而產生的切片之間的支持數組。在 Go 中,當切片超出其容量時,會指派一個新的後備數組,並將現有元素複製到新數組中。但是,如果切片的長度小於其容量,則切片及其附加元素將共用相同的支援數組。

在使用者的程式碼中,隨著 pathA 和 pathB 的大小增長,它達到了這樣的程度:切片的長度超出了其容量,並且為 pathA 分配了一個新的支援數組。但是,由於接下來創建了 pathB,因此它最終使用了相同的後備數組。

要解決此問題,使用者需要確保 pathA 和pathB 有獨立的後備陣列。這是透過使用 make() 手動為 pathB 分配一個新切片並使用 copy() 複製舊資料來實現的。

修改後的程式碼

這裡是修改過的程式碼:

<code class="go">for i := 0; i < len(prePaths); i++ {
    newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i]) + 1) * 2)
    copy(newRoute, prePaths[i])

    nextA := nextLine[i]
    nextB := nextLine[i+1]

    pathA := append(newRoute, nextA)
    pathB := append(prePaths[i], nextB)

    postPaths = append(postPaths, pathA)
    postPaths = append(postPaths, pathB)
}</code>

這段程式碼確保pathA和pathB都有自己的後備數組,防止覆蓋問題。

以上是為什麼 Go 變數會被覆蓋?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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