在 Go 中传递指针与值

我读过这篇与 Go 完全无关的有趣博客文章,作者说的一件事引起了我的注意,以下引用:

... 例如,将通道作为函数的参数传递给 all 是有效的,因为 Go 中的通道就像 C 中实现的通道数据结构的指针一样简单。 map 和其他一些也是如此类型。但是传递数组或结构体效率低下;相反,我们应该传递指向这些类型的指针。

为什么在使用某些 Go 内部类型或结构时传递指针效率低下?


万千封印
浏览 219回答 2
2回答

明月笑刀无情

传递指针并不是低效的。但作者是对的:因为数组和结构体默认是按值传递的,所以它们的内容会被复制到每个新的函数调用中。这可能是低效的。根据Go slices: usage 和 internals,数组按值传递。(切片使用指向底层数组的指针,因此它们的传递效率更高。)与切片一样,通道由make(至少隐式地)分配,因此通道充当对实际数据结构的引用。因此,当您使用结构体和实际数组时,通常会改为传递它们的引用。(有关此问题的更多详细信息,请参阅 Sean 的回答。他提出了一个很好的观点,即复制并不总是低效的。有时这是可取的。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go