登录
首页 >  Golang >  Go问答

如何进行对象的深拷贝

来源:stackoverflow

时间:2024-03-19 23:30:33 234浏览 收藏

在 Go 语言中进行对象的深拷贝对于处理复杂数据结构至关重要。通常的做法是使用 `reflect.DeepEqual` 函数来比较原始对象和副本,以确保它们的内容完全相同。然而,直接返回对象的引用作为副本的方法并不能实现真正的深拷贝,因为原始对象和副本仍然指向同一内存地址。

问题内容

我有一个复杂的数据结构,它定义了类型p,并且我想执行此类数据结构实例的深层复制。 我已经找到了这个库,但是考虑到 go 语言的语义,像下面这样的方法不是更惯用吗?:

func (receiver p) copy() *p{
   return &receiver
}

由于该方法接收 p 类型的值(并且值始终通过副本传递),因此结果应该是对源的深层副本的引用,如下例所示: p>

src := new(p)
dcp := src.copy()

确实,

src != dst => true
reflect.DeepEqual(*src, *dst) => true

解决方案


此测试表明您的方法不执行复制

package main

import (
    "fmt"
)

type teapot struct {
   t []string
}
type P struct {
   a string
   b teapot
}

func (receiver P) copy() *P{
   return &receiver
}

func main() {

x:=new(P)
x.b.t=[]string{"aa","bb"}
y:=x.copy()

y.b.t[1]="cc"  // y is altered but x should be the same

fmt.Println(x)  // but as you can see...

}

https://play.golang.org/p/xL-E4XKNXYe

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何进行对象的深拷贝》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>