深入研究 Go Slice Range 现象
在提供的代码片段中,使用 range 关键字迭代学生结构体的切片。然而,将学生地址分配给映射揭示了一个看似令人困惑的问题:生成的映射键具有相同的地址。
要理解这种现象,重要的是要认识到在 Go 中, range 关键字会迭代切片的元素,而不是地址。这意味着范围循环内的变量 Stu 是切片元素的副本。因此,当获取 Stu 的地址并将其分配给映射键时,将存储副本的地址,而不是切片元素的地址。
要纠正此问题,需要修改代码以显式获取切片元素的地址。这可以通过使用切片索引变量 i 来实现:
for i := range s { m[s[i].Name] = &s[i] }
此修改确保映射键保存实际切片元素的地址。
通过理解迭代之间的区别通过对元素进行切片并获取其地址,开发人员可以避免潜在的混乱,并确保在 Go 中使用切片时代码的预期行为。
以上是为什么 Go Slice Range 循环在使用 `&stu` 时为映射键分配相同的地址?的详细内容。更多信息请关注PHP中文网其他相关文章!