在 golang 中,变量超出循环或条件或案例的范围后会发生什么?

In golang, what happens to a variable after it goes out of scope of a loop or a condition or a case?

请不要将此标记为重复问题,因为这是针对 golang 的,并且在从通道读取时声明变量以存储大字节数组时,请就一些最佳实践提出建议。

请原谅我提出这个愚蠢的问题,但提出这个问题的原因只是我的好奇心,想确定编写从多个通道读取大型字节数组的高性能流消费者的最佳实践是什么。 (虽然过早的优化是万恶之源,但这更多是出于好奇)。我已经阅读了关于 C here, but I am requesting answer specific to go, as it is a garbage collected language, and their documentation here 的类似 senario 的答案,说 "From a correctness standpoint, you don't need to know where the variable is allocated"。

如果我有以下代码从频道读取,

    for {
    select {
    case msg := <-stream.Messages():
    ...snip...

变量msg在case语句的范围内。

谢谢。

如果通道值类型是切片,变量msg的值只是切片描述符,比较小(见https://blog.golang.org/go-slices-usage-and-internals)。包含切片引用的数据的数组将在切片放置在通道上之前分配到别处。假设该值必须在分配它的函数 returns 之后存活下来,它将在堆上。请注意,通道接收操作实际上并未移动或复制切片的内容。

一旦 msg 的值变得不可访问(通过变量超出范围或被分配不同的值),假设没有其他对切片底层数组的引用,它将受到垃圾回收。

如果不进一步了解程序的工作原理,很难说一定程度的优化是否有帮助。

Shouldn't I be bothered about it at all?

没有

(一旦它困扰你:个人资料。)