Golang append struct问题

发布于 2022-09-12 01:36:29 字数 1411 浏览 29 评论 0

小弟今天开发项目,发现一个奇怪问题 首先小弟的信息是从数据库中取出来的,取出来预备组成[]struct 返回给前端,进行任务展示,这是前提 数据库中有任务三条, 任务 1:

{[{false 1KB-20KB}] [] []}} b5a33d9d-6512-11ea-8001-000000000000 {2 0 }

任务 2:

{[{true 1GB-1TB}] [] []}} fee23a86-6506-11ea-8001-000000000000 {2 0 }}

任务 3:

{[{false 1KB-2KB}] [] []}} 9b995076-6514-11ea-8002-000000000000 {2 0 }

我利用了 append,组合成一个[]struct,可是输出之后发现

[{{[] [{false 1KB-2KB}] [] []}} 9b995076-6514-11ea-8002-000000000000 {2 0 }},
 {{[]{false 1KB-2KB}] [] []}} fee23a86-6506-11ea-8001-000000000000 {2 0 }}, 
  {{[{false 1KB-2KB}] [] []}} b5a33d9d-6512-11ea-8001-000000000000 {2 0 }}]

所有的 false 都被固定成 1kb-2kb 了,小弟写过 python,怀疑是 deepcopy 或者是 copy 的问题,但是 golang 这里实在不熟,请各位大神给小弟一点点灵感吧,谢谢!

代码如下

var sync infimanage.Sync
    var synclists []infimanage.Sync
    // fmt.Println(msg)
    etcd, err := infidb.New()
    if err != nil {
        fmt.Println(err)
    }
    syncslist, err := etcd.GetPrefixAllValue("syncwork/")
    if err != nil {
        fmt.Println(err)
    }
    for _, syncs := range syncslist {
        json.Unmarshal([]byte(syncs), &sync)
        fmt.Println(sync)
        // 这里打印输出都是正常的
        fmt.Println("xxxxxxxxxxxxxxxxxx")
        synclists = append(synclists, sync)
    }
    // 这里就不正常了
    fmt.Println(synclists)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

隱形的亼 2022-09-19 01:36:29

你把变量sync的定义放在for循环里面试试看。

现在的代码因为sync是外面共用的变量,所以每次json.Unmarshal的时候都会改变这个值,如果infimanage.Sync是值类型,那是没问题的。这里也不知道你这个类型的定义,我猜测是这样的问题。

許願樹丅啲祈禱 2022-09-19 01:36:29

通过查看 go编译源码 可以了解到, for-range其实是语法糖,内部调用还是for循环,初始化会拷贝带遍历的列表(如array,slice,map),然后每次遍历的 v 都是对同一个元素的遍历赋值。
也就是说如果直接对 v 取地址,最终只会拿到一个地址,而对应的值就是最后遍历的那个元素

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文