【发布时间】:2019-10-14 17:59:49
【问题描述】:
我想复制一个数据结构的实例。由于 go 没有任何内置函数,因此我使用的是第三方库:https://github.com/emirpasic/gods。
例如,我可以尝试使用带有哈希集的深拷贝。
var c, d hashset.Set
c = *hashset.New()
c.Add(1)
deepcopy.Copy(d, c)
c.Add(2)
fmt.Println(c.Contains(2))
fmt.Println(d.Contains(2))
fmt.Println(c.Contains(1))
fmt.Println(d.Contains(1))
但是,哈希集的内容根本没有被复制。我知道深拷贝模块不能复制未导出的值,但是由于库中没有内置的“复制构造函数”,这是否意味着在不修改其代码的情况下无法使用库完全复制数据结构实例? (我研究过的其他一些库也出现了类似的问题)。
我是 golang 的新手,感觉不对,因为类似的事情可以很容易地实现,例如在 C++ 中。我知道我可以编写自己的版本或修改他们的代码,但工作量比预期的要多,这就是为什么我认为应该有一种惯用的方式。
PS:对于可能会说“不需要这样的功能”的人,我正在将一些具有一些数据结构的复杂状态分发给并行计算线程,它们直接使用这些状态,并且不能相互干扰。
【问题讨论】:
-
使用包
reflect,如果我没记错的话,你应该能够使用unsafe实现你自己的深拷贝,包括未导出的字段。 -
@mkopriva: 但这听起来像是无中生有:) 能够深度复制所有字段确实很有用。
-
@mkopriva 您可以使用反射读取未导出的字段,但不能设置它们。见How to clone a structure with unexported field?
-
@icza stackoverflow.com/a/43918797/965900(我在最初的评论中确实提到了
unsafe) -
@mkopriva 哦,抱歉,在您的第一条评论中没有发现
unsafe字样。