首页 > 后端开发 > Golang > Go 的切片范围循环如何影响映射中的地址分配?

Go 的切片范围循环如何影响映射中的地址分配?

Mary-Kate Olsen
发布: 2024-12-03 07:06:09
原创
327 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板