我正在做这种数组复制来映射package mainimport ( "fmt")type Test struct { Id int Name string}func main() { tlist := []Test{ Test{1, "mike"}, Test{2, "clara"}, Test{3, "stefan"}, } tmap := make(map[int]*Test) // copy to map here for _, t := range tlist { tmap[t.Id] = &t fmt.Printf("list to map %v\n", tmap[t.Id]) } // debug for _, t := range tmap { t.Name = t.Name + "A" fmt.Printf("%v\n", t) } for _, t := range tlist { fmt.Printf("list after %v\n", t) }}结果输出是地图只包含所有地图项中的最后一个数组项。list to map &{1 mike}list to map &{2 clara}list to map &{3 stefan}&{3 stefanA}&{3 stefanAA}&{3 stefanAAA}list after {1 mike}list after {2 clara}list after {3 stefan}为什么在第一个循环中正确打印每个地图元素后打印地图时地图只包含最后一个数组的项目?
1 回答

婷婷同学_
TA贡献1844条经验 获得超8个赞
这是因为您在第一个循环中获取了t变量的地址。所以 map 中的所有 3 个值都是指向t变量的指针,并且t变量在循环完成后存储tlist的最后一个元素。您应该保存指针而不是循环变量t而是直接切片元素:
for i, t := range tlist {
tmap[t.Id] = &tlist[i]
fmt.Printf("list to map %v\n", tmap[t.Id])
}
- 1 回答
- 0 关注
- 82 浏览
添加回答
举报
0/150
提交
取消