小编典典

谁能提供您自己/标准的“克隆方法”约定,以供我/我们参考?

go

我在Golang中找不到“克隆”方法约定,但似乎必须要有一个。

我只看到了内置方式*clonedObj = *obj,但是它太底层了,无法处理(必要时)类似struct { member *CompositionObj }

我怀疑“ func(obj ClassA)Clone()interface {} interface”原型是否可以工作,因为调用obj2 := obj.Clone()将“松散”为ClassA设置的方法,并且需要像obj2.(*ClassA)随后那样的显式代码。

请告知工作方向。


阅读 205

收藏
2020-07-02

共1个答案

小编典典

好的,虽然没有其他人可以给我适当的参考,但我找到了一些参考示例,介绍了如何克隆自己的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”)

但是,如果您希望变量可以包含类似基本接口的任何对象的高级功能,这是我的示例:

func (t *T) Clone() YourBaseInterface

YourBaseInterface在哪里:

type YourBaseInterface interface {
    Clone() YourBaseInterface
    OtherMethod1()
    ...
}

或者可以只使用interface{}代替而不是YourBaseInterface返回,然后像obj2 := obj.Clone().(*YourBaseType)克隆后一样进行类型转换。

警告

这种原型有一个缺点。becase的Golang不支持此原型内置的,该Clone()方法不会在一些语言的功能调用,例如,当你copy(dest, src)一个[]YourTypeWithClone切片。相反,它仍然执行简单的*elem2 = *elem1结构复制。解决方案可能不使用这些内置函数,或者您可能会回过头来设计类struct成员,以便在可能的情况下进行纯复制就足以实现其复制目的。

2020-07-02