可以在声明范围之外使用golang变量的内存

时间:2018-02-21 16:42:50

标签: go memory-management

我试图了解内存管理。我可以安全地使用在范围内分配的内存。

type BigConfigurationData struct {
   subject1config *Subject1Config
   subject2config *Subject2Config
   ...
}

var p BigConfigurationData
if aFlag {
   var subject1config = Subject1Config {
      foo: bar
   }
   p.subject1config = &subject1config
}
// can i use p.subject1config here and expect the memory has not been cleaned up?

1 个答案:

答案 0 :(得分:-1)

Go看起来很简单,但实际上它可以帮助程序员。

在Go中,所有变量都是有效的引用。编译器跟踪是否有任何内存“转义”了一个作用域,然后自动分配在堆上(共享内存池)。如果内存没有逃避范围,编译器会在堆栈上分配它,这要快得多。

在您的情况下,当您分配p.subject1config =& subject1config时,这会告诉编译器该值或内存将离开作用域。编译器将从堆中分配内存,因此通过引用p.subject1config可以访问外部作用域中的内存。

Go垃圾收集器定期检查内存块是否仍然有任何指向它的refences,并在没有引用时释放内存。

简而言之,您可能会混淆“变量”和“内存”,可能是因为Go会自动为您管理内存。

编辑:这个答案可能太简单了。请阅读以下评论以获取更多信息。有关更多信息,请参阅以下链接 http://www.tapirgames.com/blog/golang-memory-management https://dougrichardson.org/2016/01/23/go-memory-allocations.html