Go中结构体在栈和堆上的分配:这与垃圾回收有何关系?
大家好!我刚从C++和Java开始学习Go,对结构体的内存分配问题感到非常困惑。在C++中,我习惯显式控制对象是在栈上创建(`MyClass obj;`)还是在堆上创建(`MyClass* obj = new MyClass();`)。在Java中,所有对象都在堆上,引用在栈上。
但在Go中,我看到结构体可以通过`myStruct := MyStruct{}`(似乎在栈上)和`myStruct := &MyStruct{}`(似乎在堆上)创建。而且Go有垃圾回收器。我完全糊涂了。
例如,我有这样一段代码:
```go
type User struct {
Name string
Age int
}
func createUser(name string, age int) *User {
u := User{Name: name, Age: age}
return &u // 返回局部变量的指针!
}
```
在C++中,这会是未定义行为(悬空指针)。但在Go中,这是可行的。这是否意味着`u`总是在堆上分配?还是编译器很聪明,自己决定?这与垃圾回收有何关系?那为什么有时人们说在Go中最好...