gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:55:18 29 4
gpt4 key购买 nike

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

请原谅我提出这个愚蠢的问题,但提出这个问题的原因只是我的好奇心,想确定编写从多个 channel 读取大型字节数组的高性能流消费者的最佳实践是什么。 (虽然过早的优化是万恶之源,但这更多是出于好奇)。我已经阅读了关于特定于 C 的类似 senario 的答案 here ,但我要求具体的答案,因为它是一种垃圾收集语言,及其文档 here说“从正确性的角度来看,您不需要知道变量的分配位置”。

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

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

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

  • 一旦超出case 语句的范围会发生什么?由于这是在同一个 native 函数中声明的,并且 stream 的大小可能是一个大字节 slice ,因此该变量是存储在堆中还是堆栈中,如果是堆,它会被垃圾回收吗,还是堆栈指针出现了?
  • 因为这是在一个无限循环中,而且 stream 的大小是一个大字节 slice ,每次创建变量和分配内存都是一个开销,或者我应该提前声明变量,并在每次迭代中继续覆盖它,以便如果涉及垃圾收集(我不确定),我可能会减少垃圾?
  • 我根本不应该为此烦恼吗?

谢谢。

最佳答案

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

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

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

关于go - 在 golang 中,变量超出循环或条件或案例的范围后会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42613846/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com