制作结构的副本

时间:2015-07-25 15:30:11

标签: go

我试图在go中制作一个结构的深层副本。在我自己构建解决方案之前,我试图在go中找到这样做的惯用方法。我确实找到了this实现的参考。但是,它似乎已经过时并且未得到积极维护。我确信这是一个人们不时需要的场景所以我必须遗漏一些东西。有没有人有任何指导?

1 个答案:

答案 0 :(得分:1)

可以在margnus1/go-deepcopy中找到更新版本的Google深度搜索代码。

它确实说明了标准库中没有深度复制的原因。

// basic copy algorithm:
// 1) recursively scan object, building up a list of all allocated
// memory ranges pointed to by the object.
// 2) recursively copy object, making sure that references
// within the data structure point to the appropriate
// places in the newly allocated data structure.

所有的算法都很复杂,依赖于反思。当然只能访问导出的字段。

// Copy makes a recursive deep copy of obj and returns the result.
//
// Pointer equality between items within obj is preserved,
// as are the relationships between slices that point to the same underlying data,
// although the data itself will be copied.
// a := Copy(b) implies reflect.DeepEqual(a, b).
// Map keys are not copied, as reflect.DeepEqual does not
// recurse into map keys.
// Due to restrictions in the reflect package, only
// types with all public members may be copied.
//
func Copy(obj interface{}) (r interface{}) {
  

我确信这是人们不时需要的场景所以我必须遗漏某些东西

作为mentioned in this thread

  

例如,传递struct值而不是struct指针通常就足够了。如果程序员足够有效地设计树或图结构,那么他们可能会预见到共享这种结构的问题   我们中的许多人都认为功能缺乏强制性的深拷贝行为,因为我们希望Go提供工具来帮助安全,而不是提高效率的障碍。

更深层次的深度镜检查版本为ulule/deepcopier

// Deep copy instance1 into instance2
Copy(instance1).To(instance2)