首頁 >後端開發 >Golang >為什麼附加多個切片時 Go 變數會被覆寫?

為什麼附加多個切片時 Go 變數會被覆寫?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-24 07:59:02283瀏覽

Why Are Go Variables Overwritten When Multiple Slices Are Appended?

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

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