视频字幕
在Go语言中,结构体的默认赋值是浅拷贝。浅拷贝只复制结构体的字段值,如果字段是指针或引用类型,则只复制引用地址,两个结构体会共享同一份数据。而深拷贝则会创建完全独立的副本,包括所有引用的数据都会被复制。
让我们看一个具体的例子。当Person结构体包含指针字段Age时,浅拷贝p2等于p1只是复制了指针的值,两个结构体的Age字段指向同一块内存。当我们修改p2的Age值时,p1的Age值也会被改变,这通常不是我们想要的结果。
手动深拷贝是最直接的方法。我们为Person结构体定义一个DeepCopy方法,在其中为指针字段分配新的内存空间,并复制原始值。这样p1和p2就拥有了完全独立的Age字段,修改其中一个不会影响另一个。
使用反射可以实现通用的深拷贝函数。通过reflect包分析对象的类型和结构,然后递归地复制每个字段。对于指针类型,创建新的指针并复制指向的值;对于结构体,递归复制每个字段。这种方法可以处理任意复杂的数据结构。
在实际开发中,我们有多种选择来实现深拷贝。手动实现性能最好但代码较多;反射实现通用性强但性能较差;第三方库使用简单但增加依赖。选择哪种方法需要根据具体场景权衡。对于简单结构体推荐手动实现,复杂结构体可以考虑反射或第三方库,性能敏感的场景要避免使用反射。