首页 > 文章列表 > 任何人都可以提供您自己/标准的“克隆方法”约定,以供我/我们的参考吗?

任何人都可以提供您自己/标准的“克隆方法”约定,以供我/我们的参考吗?

golang
180 2023-03-08

问题内容

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

我只看到了内置方式*clonedObj = *obj,但它太低级了,无法处理(必要时)案例的深拷贝struct { member *CompositionObj }

我怀疑“func (obj ClassA) Clone() interface{}”原型是否会起作用,因为调用obj2 := obj.Clone()会“松开”为 ClassA 设置的方法,并且需要像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()才能使该方法“公开”)

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

func (t *T) Clone() YourBaseInterface

YourBaseInterface 在哪里:

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

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

警告

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