Loading

go slice的拷贝问题

首先是深拷贝与浅拷贝的特点

  1. 浅拷贝实际是拷贝的地址,两个变量将会指向同一个空间,导致修改其中一方另一方也会跟着改变
  2. 深拷贝则拷贝所有的数据内容在一个新的空间内,这样两个就形成隔离,可以独立的操作而相互之间不发生影响

go中值类型都是深拷贝,而引用类型都是浅拷贝

常用的slice就有此问题
slice属于引用类型
对其用=进行复制就是浅拷贝

a:=make([]int,3)
b:=a
//此时的b就a 的浅拷贝,对b进行操作会导致a的改变

//如果a在扩容的时候,可能到导致数据的迁移,那样会导致a的地址变化,而b
//在原处,a,b之间分离

如果想要实现slice的深拷贝可以使用for循环进行复制
还可以是使用copy()

!!!但是 copy()有一个小问题
copy(a,b)会取其中容量小的为基础进行复制
如果想构造一个新的slice b,使其与a相同,此时直接创建

b:=[]type{}
copy(a,b)

是不行的,因为b此时为零值,这个copy过程什么效果也没有
所以b这个新的slice一定要指定大小
b:=make([]type,n)

另一个与拷贝相关的问题
二维切片的append问题

posted @ 2022-09-02 16:01  北方Cc  阅读(426)  评论(0编辑  收藏  举报