在 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语句的范围内。
- 一旦超出
case
语句的范围会发生什么?由于这是在同一个本机函数中声明的,并且 stream
的大小可能是一个大字节切片,因此变量将存储在堆或堆栈中,如果是堆,它将被垃圾收集,还是堆栈指针出现了吗?
- 因为这是一个无限for循环,而且
stream
的大小是一个大字节切片,每次创建变量和分配内存都是一个开销,或者我应该提前声明变量,并且在每次迭代中都继续覆盖它,所以如果涉及垃圾收集,我不确定,我可能会减少垃圾?
- 我根本不应该为此烦恼吗?
谢谢。
如果通道值类型是切片,变量msg
的值只是切片描述符,比较小(见https://blog.golang.org/go-slices-usage-and-internals)。包含切片引用的数据的数组将在切片放置在通道上之前分配到别处。假设该值必须在分配它的函数 returns 之后存活下来,它将在堆上。请注意,通道接收操作实际上并未移动或复制切片的内容。
一旦 msg
的值变得不可访问(通过变量超出范围或被分配不同的值),假设没有其他对切片底层数组的引用,它将受到垃圾回收。
如果不进一步了解程序的工作原理,很难说一定程度的优化是否有帮助。
Shouldn't I be bothered about it at all?
没有
(一旦它困扰你:个人资料。)
请不要将此标记为重复问题,因为这是针对 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语句的范围内。
- 一旦超出
case
语句的范围会发生什么?由于这是在同一个本机函数中声明的,并且stream
的大小可能是一个大字节切片,因此变量将存储在堆或堆栈中,如果是堆,它将被垃圾收集,还是堆栈指针出现了吗? - 因为这是一个无限for循环,而且
stream
的大小是一个大字节切片,每次创建变量和分配内存都是一个开销,或者我应该提前声明变量,并且在每次迭代中都继续覆盖它,所以如果涉及垃圾收集,我不确定,我可能会减少垃圾? - 我根本不应该为此烦恼吗?
谢谢。
如果通道值类型是切片,变量msg
的值只是切片描述符,比较小(见https://blog.golang.org/go-slices-usage-and-internals)。包含切片引用的数据的数组将在切片放置在通道上之前分配到别处。假设该值必须在分配它的函数 returns 之后存活下来,它将在堆上。请注意,通道接收操作实际上并未移动或复制切片的内容。
一旦 msg
的值变得不可访问(通过变量超出范围或被分配不同的值),假设没有其他对切片底层数组的引用,它将受到垃圾回收。
如果不进一步了解程序的工作原理,很难说一定程度的优化是否有帮助。
Shouldn't I be bothered about it at all?
没有
(一旦它困扰你:个人资料。)