在golang中初始化全局结构指针和全局结构之间的区别是什么



假设我有以下代码

//var mystruct *MyStruct  // method 1
//var mystruct MyStruct   // method 2
type MyStruct struct {
// struct fields
}

我理解方法1和方法2在声明mystruct变量方面的基本区别。这两种方法都需要分配相同数量的内存,而第一种方法需要一个额外的指针。第一种方法在堆上分配内存,第二种方法在堆栈上分配内存。如果堆栈内存可能处于压力之下,我想第一种方法是首选的。

在将结构变量声明为包中全局变量的这两种方法之间,还有其他实际区别吗?

声明指针不会在堆上分配内存。它只是声明了一个指针。

如果您声明了一个结构的实例(而不是指针(,那么该结构的内存将在堆上分配,并保持在那里。用于声明它的符号名称(myStruct(始终引用该结构实例。

如果您如上所述声明一个指针*myStruct,它将被初始化为nil。访问它会引起恐慌。您必须将myStruct分配给已分配的MyStruct实例的地址。一个重要的区别是,如果您声明一个指针,它指向的位置可能会在程序中发生变化。

最新更新