Alocação de structs na stack e heap em Go: como isso se relaciona com a coleta de lixo?
Olá a todos! Comecei a estudar Go depois de C++ e Java, e estou muito confuso sobre a alocação de memória para structs. Em C++, eu estava acostumado a controlar explicitamente se criava um objeto na stack (`MyClass obj;`) ou no heap (`MyClass* obj = new MyClass();`). Em Java, tudo está sempre no heap, e as referências na stack.
Mas em Go, vejo que structs podem ser criadas como `myStruct := MyStruct{}` (aparentemente na stack) e como `myStruct := &MyStruct{}` (aparentemente no heap). Além disso, Go tem um garbage collector. Estou completamente confuso.
Por exemplo, tenho este código:
```go
type User struct {
Name string
Age int
}
func createUser(name string, age int) *User {
u := User{Name: name, Age: age}
return &u // Retornando um ponteiro para uma variável local!
}
```
Em C++, isso seria um comportamento indefinido (ponteiro pendente). Em Go, funciona. Isso significa que `u` é sempre alocado no heap? Ou o compilador é inteligente e decide por conta própria? Como isso se relaciona com a coleta de lixo? Por que às vezes dizem que em Go é melhor...