首頁 >後端開發 >Golang >Go 的切片範圍循環如何影響映射中的位址分配?

Go 的切片範圍循環如何影響映射中的位址分配?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-03 07:06:09290瀏覽

How Does Go's Slice Range Loop Affect Address Assignment in Maps?

了解Go 切片範圍的行為

在Go 中,切片是一種基本資料結構,可提供高效且動態的元素存儲。使用切片時,必須理解範圍循環的行為。

考慮以下程式碼片段:

type student struct {
    Name string
    Age  int
}

func main() {
    m := make(map[string]*student)
    s := []student{
        {Name: "Allen", Age: 24},
        {Name: "Tom", Age: 23},
    }

    for _, stu := range s {
        m[stu.Name] = &stu
    }
    fmt.Println(m)
    for key, value := range m {
        fmt.Println(key, value)
    }
}

程式定義了學生結構體切片和映射。它使用範圍循環迭代切片,其中每個元素都分配給變數“stu”。然而,觀察到的意外行為是所有映射條目都指向切片內的相同位址。

根本原因:

問題源自於範圍循環的分配到變數「stu」。當循環迭代時,「stu」被指派該索引處的切片元素的副本。因此,所有映射條目都引用相同的複製值。

解決方案:

要解決此問題,程式碼應明確取得每個切片的位址元素,然後將其儲存到映射中:

for i := range s {
    m[s[i].Name] = &s[i]
}

透過進行此更改,每個映射條目現在都引用實際切片元素的位址,從而確保預期的結果行為。這證明了理解切片範圍循環的細微差別以及它們如何影響 Go 中的資料操作的重要性。

以上是Go 的切片範圍循環如何影響映射中的位址分配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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