[Go语言tips02]深拷贝与浅拷贝
0. 引言
可能在用Go写代码的时间,想要把a的值完全的给到b,此时如果写以下代码:b = a,那么你会发现,当你修改a的时候b也会随之改变,这就涉及到了浅拷贝与深拷贝的问题。
1. 什么是深拷贝
简而言之:深拷贝就是b开辟了新的空间来拷贝a的内容。(a买了一台电脑,b也买了一台电脑,两台电脑分别用两个屏幕)
此时修改a对b没有任何影响,因为地址不是共享的(修改是发生在电脑中的,a在自己电脑上操作,不会影响到b的电脑)
当数据类型默认是传值的时候,使用=赋值符来传递就会发生深拷贝,例如:
-
数组Array
-
int
-
string
-
struct
-
float64
-
bool
……
注意!数组是数组,切片是切片,两者是有区别的!!不要以为可以通过[x]int使用就是数组(切片)。
数组是深拷贝而切片是浅拷贝!
2. 什么是浅拷贝
简而言之:浅拷贝就是a把自己的地址拷贝给了b,两者共用同一个地址。(相当于一台电脑两个屏幕)
此时,修改a之后b也会随之改变,因为两者共用同一个地址。(两者共用同一台电脑,因此屏幕上显示的都是一样的)
当数据类型默认是传引用的时候,使用=赋值符来传递就会发生浅拷贝,例如:
-
切片Slice
-
Map
……
3. 如何对切片(或其他传引用的类型)进行深拷贝
切片直接用=赋值操作符传递的是引用,也就是说地址是同一个地址(浅拷贝)。
此时就可以使用以下两种方法来进行深拷贝。
①
numss := make([]int, 0)
numss = append(numss, nums[:]...)
②
numss := make([]int, len(nums))
copy(numss,nums)
相比较而言,前者更快,因此建议用方法①。

浙公网安备 33010602011771号