切片到指针映射重复值

Slice to Map of pointers duplicates values

提问人:Lupascu Gabriel Cristian 提问时间:12/17/2022 最后编辑:Lupascu Gabriel Cristian 更新时间:12/17/2022 访问量:55

问:

这是一个初学者的问题,关于为什么我在尝试从 go lang 中的切片获取地图时会得到这样的结果。我有这个代码:

func (p *ProductsStruct) ToMap() map[int32]*Product {
    result := map[int32]*Product{}

    for _, prod := range p.Products {
        result[prod.ProductId] = &prod
    }

    return result
}

ProductsStruct 只有 Product 的一部分,Product 结构如下

type ProductsMedusa struct {
    Products []ProductMedusa
}

type Product struct {
    ProductId    int32
    ProductTitle string
    PriceUSD     float32
}

我不明白为什么调用函数 ToMap() 会产生一个结果,其中包含所有键,但指向同一对象的指针:最后一个。另外,我知道如果我不使用地图值作为指针,它可以正常工作。

enter image description here

谢谢

Go 指针 切片 GO-MAP

评论

2赞 mkopriva 12/17/2022
添加为循环内的第一行。(即,刚好在上面)。重复值的原因是只分配一次迭代变量(例如),然后它使用相应的值为每次迭代更新这些变量的内容,但是因为你取的是那个单一变量的地址(即),当循环退出时,你最终会发现所有指针都指向同一个地址, 存储上次迭代值。prod := prodresult[prod.ProductId] = &prodfor ... rangeprod&prod
2赞 Cerise Limón 12/17/2022
...或者,如果需要指向切片元素的指针:for i, prod := range p.Products { result[prod.ProductId] = &p.Products[i] }
1赞 mkopriva 12/17/2022
从本质上讲,这就是代码中发生的事情:go.dev/play/p/nrpysD5vcDQ
0赞 Lupascu Gabriel Cristian 12/17/2022
@CeriseLimón这实际上解决了我的下一个问题,谢谢

答: 暂无答案