猿问

将数组复制到地图会导致地图中的相同项目

我正在做这种数组复制来映射


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}

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


慕尼黑8549860
浏览 83回答 1
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])}
随时随地看视频慕课网APP

相关分类

Go
我要回答