【问题标题】:Copying array to map results in same items in map [duplicate]将数组复制到地图会导致地图中的相同项目[重复]
【发布时间】:2020-09-05 22:59:36
【问题描述】:

我正在做这种数组复制到地图

package main

import (
    "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}

为什么在第一个循环中正确打印每个地图元素后打印地图时地图只包含最后一个数组的项目?

【问题讨论】:

    标签: go


    【解决方案1】:

    这是因为您在第一个循环中获取了 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])
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2021-04-07
      相关资源
      最近更新 更多