【发布时间】:2021-01-12 10:50:01
【问题描述】:
我想在二维切片中添加切片数据:
var a_slice []int
var b_slice [][]int
for i:=0; i<num; i++{
a_slice = some_function()
b_slice = append(b_slice, a_slice)
}
但最后b_slice的内容相同,最后一个“some_funtion”返回值。
例如,
i=0, result:a_slice:[1,1,1], b_slice:[1,1,1];
i=1, result:a_slice:[2,2,2], b_slice:[2,2,2][2,2,2];
i=2, result:a_slice:[3,3,3], b_slice:[3,3,3][3,3,3][3,3,3];
这不是我想要的。我想要 [[1,1,1] [2,2,2] [3,3,3]]。
我尝试了“复制”,但也没有得到解决方案。我记得“复制”功能可以做深拷贝。 “追加”函数还将分配新的数据(不是指针)存储来进行深度复制。我试过(希望分配新内存并深拷贝原始数据)但结果相同。
那么我怀疑“追加”和“复制”功能不能与二维切片一起使用?
为什么会发生这种情况以及如何完成这项任务?
(“some_function”是fmt.Fscan。在原始代码中是这样的:
var a_slice = make([]int, 3)
var iface_slice = make([]interface{}, 3)
var b_slice=make([][]int, 3)
for i:= range a_slice{
iface_slice[i] = &a_slice[i]
}
for i:=0; i<num; i++{
if _, err := fmt.Fscan(f, iface_slice...); err != nil{
return err
}else{
b_slice = append(b_slice, a_slice)
}
}
)
【问题讨论】:
-
您应该显示
some_function的代码。但请记住,切片只是标题,您可能需要阅读slice internals -
谢谢! “some_function”是 fmt.Fscan。在原始代码中是这样的:
-
那么您不会每次都为
a_slice分配一个新值。相反,您将覆盖与添加到b_slice的其他切片描述符共享的内容。我建议您阅读我在上面发布的链接。 -
标记为重复的问题解释了切片是如何构造的,这就是您看到这种行为的原因。在这个问题和切片内部帖子之间,您应该很好地掌握它们的功能。
-
嗨尼克,追加不是深度复制,我这里有一个示例,它使用追加并将指针追加到切片并显示如果您修改底层数据,它会为所有这些修改它,因此显示 append 不会进行深层复制。 play.golang.org/p/WdxXXthJxzB