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中文網其他相關文章!