Avatar ·

Asignación de estructuras en la pila y el montón en Go: ¿cómo se relaciona con la recolección de basura?

¡Hola a todos! Acabo de empezar a aprender Go después de C++ y Java, y me confunde mucho la cuestión de la asignación de memoria para estructuras. En C++ estoy acostumbrado a controlar explícitamente si creo un objeto en la pila (`MyClass obj;`) o en el montón (`MyClass* obj = new MyClass();`). En Java todo está siempre en el montón, y las referencias en la pila. Pero en Go veo que las estructuras se pueden crear como `myStruct := MyStruct{}` (aparentemente en la pila) y como `myStruct := &MyStruct{}` (aparentemente en el montón). Además, Go tiene un garbage collector. Estoy muy confundido. Por ejemplo, tengo 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 // ¡Devuelvo un puntero a una variable local! } ``` En C++ esto sería un comportamiento indefinido (puntero colgante). En Go funciona. ¿Significa esto que `u` siempre se asigna en el montón? ¿O el compilador es inteligente y decide por sí mismo? ¿Cómo se relaciona esto con el garbage collector? ¿Por qué a veces se dice que en Go es mejor...