Go 變數被覆蓋(Bug?)
設定多個變數時會出現此問題,每個變數都是透過將元素元素附加到現有切片來定義的,但是當設定第二個變數時,一個變數會被覆寫。
考慮以下程式碼片段:
<code class="go">for i := 0; i < len(prePaths); i++ { route := prePaths[i] nextA := nextLine[i] nextB := nextLine[i+1] pathA := append(route, nextA) pathB := append(route, nextB) postPaths = append(postPaths, pathA) postPaths = append(postPaths, pathB) }</code>
問題出在迴圈的第二行,其中 'pathA' 和'pathB' 被定義為附加元素的切片。但是,追加到切片不會建立新切片;而是會建立新切片。相反,它會修改現有切片。
在這種情況下,「route」是要附加到的現有切片。因此,當創建“pathA”時,它與“route”共享相同的底層數組。隨後,當建立“pathB”時,它也與“pathA”共用相同的陣列。
由於「pathB」是附加到的最後一個切片,因此基礎數組中的最後一個元素將設定為附加的值到「路徑B」。因此,共享相同數組的“pathA”也反映了這一變化。這解釋了為什麼設定“pathB”時“pathA”會被覆蓋。
要解決此問題,必須為「pathA」和「pathB」建立獨立的切片。這可以透過使用“make”和“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>
在此程式碼中,「newRoute」是一個使用「make」函數建立的新切片,確保它具有獨立的數據。然後使用“copy”函數將資料從“prePaths[i]”複製到新切片“newRoute”中。之後,使用獨立的切片定義'pathA'和'pathB',解決了最初的問題。
以上是為什麼附加多個切片時 Go 變數會被覆寫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!