[Go语言tips02]深拷贝与浅拷贝

0. 引言

可能在用Go写代码的时间,想要把a的值完全的给到b,此时如果写以下代码:b = a,那么你会发现,当你修改a的时候b也会随之改变,这就涉及到了浅拷贝与深拷贝的问题。

1. 什么是深拷贝

简而言之:深拷贝就是b开辟了新的空间来拷贝a的内容。(a买了一台电脑,b也买了一台电脑,两台电脑分别用两个屏幕)

此时修改a对b没有任何影响,因为地址不是共享的(修改是发生在电脑中的,a在自己电脑上操作,不会影响到b的电脑)

当数据类型默认是传值的时候,使用=赋值符来传递就会发生深拷贝,例如:

  1. 数组Array

  2. int

  3. string

  4. struct

  5. float64

  6. bool

    ……

注意!数组是数组,切片是切片,两者是有区别的!!不要以为可以通过[x]int使用就是数组(切片)。

数组是深拷贝而切片是浅拷贝!

2. 什么是浅拷贝

简而言之:浅拷贝就是a把自己的地址拷贝给了b,两者共用同一个地址。(相当于一台电脑两个屏幕)

此时,修改a之后b也会随之改变,因为两者共用同一个地址。(两者共用同一台电脑,因此屏幕上显示的都是一样的)

当数据类型默认是传引用的时候,使用=赋值符来传递就会发生浅拷贝,例如:

  1. 切片Slice

  2. Map

    ……

3. 如何对切片(或其他传引用的类型)进行深拷贝

切片直接用=赋值操作符传递的是引用,也就是说地址是同一个地址(浅拷贝)。

此时就可以使用以下两种方法来进行深拷贝。

numss := make([]int, 0)
numss = append(numss, nums[:]...)

numss := make([]int, len(nums))
copy(numss,nums)

相比较而言,前者更快,因此建议用方法①。

posted @ 2023-03-01 17:21  WtcSky  阅读(156)  评论(0)    收藏  举报