如何";附加“;或;“复制”;在golang从一个切片到二维切片?
我想将切片数据添加到二维切片:如何";附加“;或;“复制”;在golang从一个切片到二维切片?,go,copy,append,2d,slice,Go,Copy,Append,2d,Slice,我想将切片数据添加到二维切片: 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) } 这不是我想要的。我想要[[1,1,1][2,2,2][3,3,3]] 我尝试了“复制”,但也没有得到解决方案。我记得“复制”功能可以进行深度复制。“append”函数还将分配新数据(而不是指针)存储以进行
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)
}
这不是我想要的。我想要[[1,1,1][2,2,2][3,3,3]]
我尝试了“复制”,但也没有得到解决方案。我记得“复制”功能可以进行深度复制。“append”函数还将分配新数据(而不是指针)存储以进行深度复制。我尝试过(希望分配新内存并深度复制原始数据),但结果相同。因此,我怀疑“append”和“copy”函数不能与2D切片一起工作? 为什么会发生这种情况?如何完成这项任务 (some_函数是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)
}
}
var a_slice=make([]int,3)
var iface_slice=make([]接口{},3)
var b_slice=make([]整型,3)
对于i:=范围a_切片{
iface\u slice[i]=&a\u slice[i]
}
对于i:=0;i可能您正在变异a_切片
尝试在循环中声明一个新的a_slice
实例,这样你的函数就不会过度使用以前的实例
var b_slice [][]int
for i:=0; i<num; i++{
var a_slice []int
a_slice = some_function()
b_slice = append(b_slice, a_slice)
}
var b_slice[]int
对于i:=0;i您应该显示some\u函数的代码
。但是请记住,切片只是标题,您可能需要阅读“some\u函数”是fmt.Fscan。在原始代码中是这样的:那么你不是每次都给a_slice
分配一个新值。相反,你覆盖了与添加到b_slice
的其他切片描述符共享的内容。我建议你阅读我上面发布的链接。标记为replicate的问题解释了切片的缺点Structed,这就是你看到这种行为的原因。在这个问题和slice Internal post之间,你应该很好地理解它们是如何工作的。嗨,Nick,append没有深度复制,我这里有一个例子,它使用append并将指针附加到一个slice,并显示如果你修改底层数据,它会为所有这些数据修改它,因此显示append不会进行深度复制。所以“append”只是将指针附加到a_片,a_片有一个poniter到存储数据的内存中?我听说“append”将创建新内存来保存数据,当它附加一个片而不是int或float32时,我错了吗?嗨,Nick,片中有一个指向底层数组的指针,因此即使复制了片,新复制的片仍然会指向dame底层数组。您可以阅读更多关于片内部的内容herehttps://blog.golang.org/slices-intro
var b_slice [][]int
for i:=0; i<num; i++{
var a_slice []int
a_slice = some_function()
b_slice = append(b_slice, a_slice)
}