登录
首页 >  Golang >  Go问答

在地图中通过复制数组会生成相同的项目

来源:stackoverflow

时间:2024-03-03 13:54:20 135浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《在地图中通过复制数组会生成相同的项目》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

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

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}

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


解决方案


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

好了,本文到此结束,带大家了解了《在地图中通过复制数组会生成相同的项目》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>