【问题标题】:how to "append" or "copy" a slice to 2D slice in golang? [duplicate]如何在golang中将切片“附加”或“复制”到二维切片? [复制]
【发布时间】: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

标签: go copy append 2d slice


【解决方案1】:

也许你正在变异a_slice

尝试在循环中声明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) 
}   

【讨论】:

  • 所以“附加”只是附加一个指向 a_slice 的指针,而 a_slice 有一个指向存储数据的内存的指针?我听说“追加”会创建新的内存来保存数据,当它追加切片而不是 int 或 float32 时我错了吗?
  • 嗨尼克,切片内部是一个指向底层数组的指针,所以即使切片被复制,新复制的切片仍将指向底层数组。您可以在此处阅读有关切片内部的更多信息 https://blog.golang.org/slices-intro
猜你喜欢
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2013-12-10
  • 2021-01-29
  • 1970-01-01
  • 2020-08-10
  • 2016-05-25
  • 2019-01-02
相关资源
最近更新 更多