Go语言切片转指针Map时值重复问题求助
Go切片转Map时指针指向同一对象的问题解析
你遇到的问题核心在于for range循环的临时变量复用机制:
在for _, prod := range p.Products循环中,prod是循环内的临时变量,整个循环过程中它只会被初始化一次,每次循环只是把切片当前元素的值拷贝到这个临时变量的内存空间里。所以你每次取&prod得到的都是同一个内存地址,当循环结束后,这个地址里存的是最后一次循环拷贝的元素值,最终map里所有的指针都会指向这个值。
而当你不用指针作为map值时,每次循环都会把prod的当前值(也就是切片元素的拷贝)存入map,每个值都是独立的,所以结果正常。
解决方案
有两种常用的修正方式:
方式1:创建循环内的临时变量
每次循环时,把当前元素赋值给一个新的临时变量,再取这个变量的地址:
func (p *ProductsStruct) ToMap() map[int32]*Product { result := map[int32]*Product{} for _, prod := range p.Products { temp := prod // 创建临时变量,拷贝当前元素值 result[prod.ProductId] = &temp } return result }
方式2:直接取切片元素的地址
改用索引遍历切片,直接获取切片中对应元素的内存地址:
func (p *ProductsStruct) ToMap() map[int32]*Product { result := map[int32]*Product{} for i := range p.Products { prod := &p.Products[i] // 直接取切片元素的地址 result[prod.ProductId] = prod } return result }
这两种方式都能确保map中的每个指针都指向切片中对应的独立元素,避免因临时变量复用导致的问题。
内容的提问来源于stack exchange,提问作者Lupascu Gabriel Cristian
相关产品推荐
相关产品推荐

