登录
首页 >  Golang >  Go问答

golang 是否深复制整个接收者值?

来源:stackoverflow

时间:2024-04-20 08:18:37 405浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《golang 是否深复制整个接收者值?》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我几乎可以肯定这一点,但我想 100% 确定。因为这在 js/php 之后看起来很奇怪。

type Vertex struct {
    X, Y float64
}

func (v Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

那么每次 scale 调用都会对 v vertex 参数进行深度复制(强调这一点),这是真的吗?因此,我们应该使用指针接收器而不是值接收器以避免深度复制?

这同样适用于参数,对吧?复制发生的其他地方还有哪些?


解决方案


是的,已制作副本。如果值很大,您关心避免复制,并且没有其他考虑因素(例如出于各种原因想要副本),请使用指针接收器。

值接收器与指针接收器的 Go FAQ has a useful entry

请注意,已创建副本,但您说的是“深层复制”,因此此处要小心 - 通常深层复制意味着递归副本,包括指针所指向的内容(例如复制整个树)。这里的副本是浅副本。如果 Vertex 具有指针字段,则将复制这些指针的,但不会复制它们指向的内容。 Go 网上有很多关于浅拷贝和深拷贝的讨论;例如 this SO question。如果有结构体字段,它们的也会被复制,所以它在结构体嵌套意义上是“深”的,但在指针意义上不是“深”的。

没有。 Go不执行深复制,只执行浅复制。

在 Go 中,所有参数都按值传递,就像通过赋值给参数或接收者一样。

不正确,

例如,来自 Go 标准库:

好了,本文到此结束,带大家了解了《golang 是否深复制整个接收者值?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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