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