Golang append struct 问题,请诸位大神留步一观

2020-03-15 19:21:54 +08:00
 PEIENYKYK

小弟今天开发项目,发现一个奇怪问题 首先小弟的信息是从数据库中取出来的,取出来预备组成[]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 这里实在不熟,请各位大神给小弟一点点灵感吧,谢谢!

1862 次点击
所在节点    Go 编程语言
7 条回复
vus520
2020-03-15 20:38:59 +08:00
看不懂,是我的话就提前定义好 struct,取出来以后全还原到 struct 对象,再处理
whoami9894
2020-03-15 20:39:30 +08:00
全部都 unmarshal 到同一块内存了,你应该每轮迭代定义个新 sync
PEIENYKYK
2020-03-15 20:42:00 +08:00
@whoami9894 对,您的点拨很到位,谢谢谢谢!感恩
newmiao
2020-03-15 20:50:01 +08:00
好像知乎上看到你的问题,回答了你,怀疑是 for-range 用了指针,参考: https://mp.weixin.qq.com/s/klJBAi5LvdJOGvma2Ir0OA
bintianbaihua
2020-03-15 21:09:59 +08:00
for-range 的经典坑。
whoami9894
2020-03-15 22:25:03 +08:00
@whoami9894 #2
又看了一下,还有点问题
如果你那个`infimanage.Sync`是个 interface 并且实际类型是个 pointer 的话才会出现我#2 说的问题,不过看你最后生成的数据里只有`{false 1KB-2KB}`相同,后面的 uuid 是不同的,那么就排除我#2 说的情况。猜测是你后两次迭代的 JSON 数据中`{false 1KB-2KB}`字段有误(比如字段名出错),导致只 unmarshal 了后面的正常数据到你复用的 sync 里,然后把 sync 的拷贝 append

而且你粘贴的输出明显有问题:
`{[] [{false 1KB-2KB}] [] []}}`
`{[]{false 1KB-2KB}] [] []}}`
`{[{false 1KB-2KB}] [] []}}`
建议按上面几点自己排查一下
rrfeng
2020-03-16 10:47:41 +08:00
把第一行 var sync infimanage.Sync 挪到 for 循环里面。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/653050

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX