复制结构体(创建一份拷贝)
结构体的复制用赋值语句这种简单的形式。
上例中,t
和 u
就是独立的对象(结构体)了。
因为类型T
中不包含任何引用类型(切片slice、映射map、数据通道channel)作为它的字段,因此对t
和u
的值进行修改并不会彼此影响。
然而,假如T
中包含的有引用类型,比如:
如果还只是简单地用赋值语句来拷贝对象,其结果是两个不同的对象引用了相同的切片。
因为u
和t
都指向了相同的切片,因此在一个变量中修改了切片,另一个变量也会受影响而改变。
因此,在复制包含引用类型的结构体时需要十分小心,记住这个特性,否则可能会出现意料不到的错误。
如果要结构体中引用类型字段也真实拷贝独立存在,修改其中一个而不影响另一个,需要像下面这样显式地完成复制:
译者注
本节谈论的利用赋值语句隐式拷贝和make函数显式拷贝的区别,实际上就是浅拷贝和深拷贝的区别。
在用赋值语句拷贝时,系统虽然为u.xs
分配了新内存地址用于存放值,此地址与t.xs
不同,但所存放的值并不是具体的切片[1 2 3]
,而是原切片的指针。在赋值语句发生拷贝的瞬间,复制了指针,而不是复制了值,所以指向了相同的内存空间。
最后更新于
这有帮助吗?