首頁 > 後端開發 > Golang > 為什麼在 Go 中向切片追加指標會導致意外的值被覆蓋?

為什麼在 Go 中向切片追加指標會導致意外的值被覆蓋?

Barbara Streisand
發布: 2024-12-15 09:24:10
原創
497 人瀏覽過

Why Does Appending Pointers to a Slice in Go Result in Unexpected Overwritten Values?

奇怪的Golang「追加」行為:覆蓋切片中的值

在Golang 中,追加到切片時,了解其差異非常重要指標類型和非指標類型之間。

考慮這個例子code:

import "fmt"

type Foo struct {
    val int
}

func main() {
    var a = make([]*Foo, 1)
    a[0] = &Foo{0}

    var b = [3]Foo{Foo{1}, Foo{2}, Foo{3}}
    for _, e := range b {
        a = append(a, &e)
    }

    for _, e := range a {
        fmt.Printf("%v ", *e)
    }
}
登入後複製

預期輸出為{0} {1} {2} {3},但實際列印為{0} {3} {3} { 3}。這是因為 for 迴圈會對數組元素的副本進行操作。

使用 for ... range 進行迭代時,會建立一個暫時循環變數並為其指派陣列元素的值。在本例中,臨時變數的類型為 Foo。但是,當追加到切片時,會加入臨時變數的位址,而不是實際陣列元素的位址。

在每次循環迭代中,該臨時變數都會被覆蓋為數組最後一個元素的值數組,即 Foo{3}。因此,切片包含對相同指標的多個引用,指向數組的最後一個元素。

要解決此問題,應附加數組元素的位址而不是循環變數:

for i := range b {
    a = append(a, &b[i])
}
登入後複製

透過此修改,輸出如預期:{0} {1} {2} {3 }。

此行為突出了理解的重要性Go 的類型系統以及使用切片時指針和非指針的區別。

以上是為什麼在 Go 中向切片追加指標會導致意外的值被覆蓋?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板