登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-03-06 09:47:41 356浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《任何人都可以提供您自己/标准的“克隆方法”约定,以供我/我们的参考吗?》,正文内容主要涉及到golang等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我在 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结构复制。解决方案可能不使用这些内置,或者您可能会回过头来设计类结构成员,以便在可能的情况下进行纯复制就足以达到其复制目的。

到这里,我们也就讲完了《任何人都可以提供您自己/标准的“克隆方法”约定,以供我/我们的参考吗?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>