萧潇墨 2020-03-04 23:26 采纳率: 75%
浏览 695
已采纳

go语言数组添加元素为什么都是重复的

我从MySQL里面查询到一个结构体数组,然后把结构体遍历存到map里面去,接着在把map存到数组里面去,结果我发现存出来的数据怎么都是重复的,通过下标和append都不好使,好奇怪?
代码如下所示

func (this *Admin_Usre) Tojsons(user []Admin_Usre) []map[string]interface{} {
    data:=make(map[string]interface{})
    res:=make([]map[string]interface{},len(user))

    for i:=0;i<len(user);i++{
        data["id"]=user[i].ID
        data["username"]=user[i].Username
        data["nickname"]=user[i].Nickname
        data["createdat"]=user[i].CreatedAt

        if i==0{
            print("进来了")
            res[0]=data
        }
        if i==1{
            res[1]=data
        }
        if i==2{
            res[2]=data
        }
        fmt.Println(data)
        fmt.Println(i)
        fmt.Println(res)
    }


    return res

}

打印结果如下所示:

进来了map[createdat:2020-02-29 21:24:17 +0800 CST id:1 nickname: username:wzt]
0
[map[createdat:2020-02-29 21:24:17 +0800 CST id:1 nickname: username:wzt] map[] map[] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-02-29 21:38:30 +0800 CST id:2 nickname: username:wzt]
1
[map[createdat:2020-02-29 21:38:30 +0800 CST id:2 nickname: username:wzt] map[createdat:2020-02-29 21:38:30 +0800 CST id:2 nickname: username:wzt] map[] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-03-04 21:53:16 +0800 CST id:3 nickname: username:]
2
[map[createdat:2020-03-04 21:53:16 +0800 CST id:3 nickname: username:] map[createdat:2020-03-04 21:53:16 +0800 CST id:3 nickname: username:] map[createdat:2020-03-04 21:53:16 +0800 CST id:3 nickname: userna
me:] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-03-04 21:54:57 +0800 CST id:4 nickname: username:]
3
[map[createdat:2020-03-04 21:54:57 +0800 CST id:4 nickname: username:] map[createdat:2020-03-04 21:54:57 +0800 CST id:4 nickname: username:] map[createdat:2020-03-04 21:54:57 +0800 CST id:4 nickname: userna
me:] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-03-04 21:55:38 +0800 CST id:5 nickname: username:]
4
[map[createdat:2020-03-04 21:55:38 +0800 CST id:5 nickname: username:] map[createdat:2020-03-04 21:55:38 +0800 CST id:5 nickname: username:] map[createdat:2020-03-04 21:55:38 +0800 CST id:5 nickname: userna
me:] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-03-04 21:56:18 +0800 CST id:6 nickname: username:]
5
[map[createdat:2020-03-04 21:56:18 +0800 CST id:6 nickname: username:] map[createdat:2020-03-04 21:56:18 +0800 CST id:6 nickname: username:] map[createdat:2020-03-04 21:56:18 +0800 CST id:6 nickname: userna
me:] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-03-04 21:59:52 +0800 CST id:7 nickname: username:]
6
[map[createdat:2020-03-04 21:59:52 +0800 CST id:7 nickname: username:] map[createdat:2020-03-04 21:59:52 +0800 CST id:7 nickname: username:] map[createdat:2020-03-04 21:59:52 +0800 CST id:7 nickname: userna
me:] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-03-04 22:00:33 +0800 CST id:8 nickname: username:]
7
[map[createdat:2020-03-04 22:00:33 +0800 CST id:8 nickname: username:] map[createdat:2020-03-04 22:00:33 +0800 CST id:8 nickname: username:] map[createdat:2020-03-04 22:00:33 +0800 CST id:8 nickname: userna
me:] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-03-04 22:03:52 +0800 CST id:9 nickname: username:]
8
[map[createdat:2020-03-04 22:03:52 +0800 CST id:9 nickname: username:] map[createdat:2020-03-04 22:03:52 +0800 CST id:9 nickname: username:] map[createdat:2020-03-04 22:03:52 +0800 CST id:9 nickname: userna
me:] map[] map[] map[] map[] map[] map[] map[]]
map[createdat:2020-03-04 22:06:32 +0800 CST id:10 nickname: username:]
9
[map[createdat:2020-03-04 22:06:32 +0800 CST id:10 nickname: username:] map[createdat:2020-03-04 22:06:32 +0800 CST id:10 nickname: username:] map[createdat:2020-03-04 22:06:32 +0800 CST id:10 nickname: use
rname:] map[] map[] map[] map[] map[] map[] map[]]


结果就是这样的 我用append也是一样的
第一次map中的数据id为1
数组存入了1条id为1的数据
第二次map中的数据id为2
数组存入了2条id为2的数据
第三次map中的数据id为3
数组存入了3条id为3的数据
以此类推下去
我很奇怪,当i等于1的时候都没有进入到i等于0这个if条件 它怎么会把数据为下标为0的这个数据给覆盖了

  • 写回答

2条回答 默认 最新

  • random_w 2020-03-05 14:04
    关注

    在for循环前面你创建了data,在for循环里面先对data的四个键赋值,然后再将data添加到res切片里面,res的每一个元素的值都指向同一个地址,也就是说你不管添加多少次res里面的值都等于data最新的值。
    你可以直接给res赋值,data是可以省略的。
    res[i]["id"]=user[i].ID
    res[i]["username"]=user[i].Username
    res[i]["nickname"]=user[i].Nickname
    res[i]["createdat"]=user[i].CreatedAt

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大