我试图了解内存管理。我可以安全地使用在范围内分配的内存。
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?
答案 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