我在Golang中找不到“克隆”方法约定,但似乎必须要有一个。
我只看到了内置方式*clonedObj = *obj,但是它太底层了,无法处理(必要时)类似struct { member *CompositionObj }
*clonedObj = *obj
struct { member *CompositionObj }
我怀疑“ func(obj ClassA)Clone()interface {} interface”原型是否可以工作,因为调用obj2 := obj.Clone()将“松散”为ClassA设置的方法,并且需要像obj2.(*ClassA)随后那样的显式代码。
obj2 := obj.Clone()
obj2.(*ClassA)
请告知工作方向。
好的,虽然没有其他人可以给我适当的参考,但我找到了一些参考示例,介绍了如何克隆自己的Go和想要共享。
(如果这个答案对您有用,请只给我几个投票。我不是要赢得选票。欢迎其他更好的答案和评论)
我在“ github.com/jinzhu/gorm”包(数据库的ORM库)中找到了该原型,以供参考:
func (s *DB) clone() *DB { db := &DB{ ... } ... return db }
软件包“ golang.org/x/net/html/atom”中的相似模式:
func (n *Node) clone() *Node { m := &Node{ Type: n.Type, ... } ... return m }
如果Clone()的调用方在克隆时始终知道您的对象类型,那么上述原型就足够了。(并且您需要大写Clone()以使该方法成为“ public”)
Clone()
但是,如果您希望变量可以包含类似基本接口的任何对象的高级功能,这是我的示例:
func (t *T) Clone() YourBaseInterface
YourBaseInterface在哪里:
type YourBaseInterface interface { Clone() YourBaseInterface OtherMethod1() ... }
或者可以只使用interface{}代替而不是YourBaseInterface返回,然后像obj2 := obj.Clone().(*YourBaseType)克隆后一样进行类型转换。
interface{}
YourBaseInterface
obj2 := obj.Clone().(*YourBaseType)
这种原型有一个缺点。becase的Golang不支持此原型内置的,该Clone()方法不会在一些语言的功能调用,例如,当你copy(dest, src)一个[]YourTypeWithClone切片。相反,它仍然执行简单的*elem2 = *elem1结构复制。解决方案可能不使用这些内置函数,或者您可能会回过头来设计类struct成员,以便在可能的情况下进行纯复制就足以实现其复制目的。
copy(dest, src)
[]YourTypeWithClone
*elem2 = *elem1