首页 > 后端开发 > Golang > 为什么 Go Slice Range 循环在映射结构时会创建共享地址?

为什么 Go Slice Range 循环在映射结构时会创建共享地址?

Linda Hamilton
发布: 2024-12-04 22:44:11
原创
425 人浏览过

Why Do Go Slice Range Loops Create Shared Addresses When Mapping Structs?

理解 Go 切片范围现象

问题:神秘的切片范围行为

在 Go 中,切片是一种强大的可以迭代的数据结构超过使用 range 关键字。然而,在一个特殊的现象中,当使用 for-range 迭代结构体切片时,结果映射中的元素共享相同的地址。这种行为可能会令人困惑,特别是因为原始切片中的元素应该具有唯一的地址。

解释:局部变量的陷阱

理解这种现象的关键在于变量的方式存储在内存中。当访问 for-range 循环中的切片元素(本例中为 stu)时,局部变量 Stu 保存该结构的副本。将指针分配给局部变量可以有效地将映射中的所有元素指向内存中结构体的同一副本。

解决问题:传递切片元素地址

要解决此问题,分配切片元素的地址,必须修改代码以获取切片元素本身的地址。通过使用 s[i] 而不是 Stu,指向切片中实际元素的指针被分配给映射。

示例:演示解决方案

package main

import "fmt"

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 i := range s {
        m[s[i].Name] = &s[i] // Change here
    }
    fmt.Println(m)
    for key, value := range m {
        fmt.Println(key, value)
    }
}
登录后复制

输出:

map[Allen:0xc0000a6058 Tom:0xc0000a6060]
Allen &{Allen 24}
Tom &{Tom 23}
登录后复制

结论

通过了解底层内存管理行为,我们可以解决这种切片范围现象 去。通过获取切片元素本身的地址,我们确保映射中的每个元素都指向内存中唯一的结构体,从而保持数据完整性。

以上是为什么 Go Slice Range 循环在映射结构时会创建共享地址?的详细内容。更多信息请关注PHP中文网其他相关文章!

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