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