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

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条)

报告相同问题?

悬赏问题

  • ¥100 需求高精度PT100设计电路和算法
  • ¥15 单片机配网,继电器开关,广播
  • ¥60 Qcustomplot绘制实时动态曲线
  • ¥20 运用matlab画x-y图
  • ¥15 用idea运行项目,运行tomcat报错:断言失败
  • ¥15 Sqlserver查询链接服务器数据问题
  • ¥15 Bibtex4Word 引用中文文献
  • ¥20 用opencv c/c++ 转换成灰度图,然后做一下直方图均衡,输出mp4文件
  • ¥20 matlab中的双层数值积分
  • ¥50 服务器打印水晶报表问题