深度复制struct在golang中具有指针0值

时间:2017-08-24 08:51:36

标签: pointers go deep-copy gob go-reflect

我在golang中有一个结构,如下所示

type Test struct {
    prop *int
}

prop指向零值时,我想对struct对象进行深度复制。真正的结构体中有更多的字段,我想要整个struct obj的深度复制。我尝试使用gob编码解码方式,但由于设计的结果here,它将指针转换为0指向nil指针。我还尝试使用reflect.Copy但是它会因错误panic: reflect: call of reflect.Copy on struct Value而发生恐慌。是否有更好的方法来深度复制这样的结构对象?

编辑: 我尝试使用json编码/解码,它有点工作。但我不知道它的缺点。

func DeepCopy(a, b interface{}) {
    byt, _ := json.Marshal(a)
    json.Unmarshal(byt, b)
}

对此解决方案有何评论?

2 个答案:

答案 0 :(得分:1)

https://play.golang.org/p/fVKW62BYDm

我使用https://github.com/mohae/deepcopy/blob/master/deepcopy.go作为示例。 reflect.Copy仅适用于切片或数组。 如您所见,使用反射是正确的方法,但它比简单地调用reflect.Copy更复杂。还有一些其他软件包可以实现深层复制,但我对这些软件包没有任何经验。

答案 1 :(得分:0)

截至目前,我正在使用json编码/解码解决方案并且运行良好。

func DeepCopy(a, b interface{}) {
    byt, _ := json.Marshal(a)
    json.Unmarshal(byt, b)
}

我听说可能的缺点是:

  • 它有点慢
  • 在struct
  • 中使用json-tags
  • 仅复制公共成员

但他们现在都没有影响我。所以我把它设置为答案,直到我得到比这更好的解决方案。