Go es un lenguaje que a menudo se describe como sencillo y rápido. Pero bajo el capó hace un montón de magia, especialmente cuando se trata de trabajar con la memoria. Comprender dónde y cómo se almacenan los datos puede ayudarte a escribir un código más eficiente, evitar asignaciones innecesarias y comprender mejor el comportamiento del programa.
Pila y montón: conceptos básicos
Pila (stack) - memoria que funciona según el principio LIFO (último en entrar, primero en salir). Las variables viven hasta que se sale de la función. Trabajar con una pila es rápido y casi gratis.
Montón (heap) - área de memoria para objetos cuya vida útil no se puede determinar de antemano. Gestionado por el recolector de basura (GC). Las asignaciones son más caras y la recolección puede ralentizar el programa.
La diferencia principal: en la pila, la memoria se libera automáticamente al salir de la función, y en el montón, el GC se encarga de ello.
Escape analysis: ¿quién escapó en grupo?
Cuando el compilador de Go encuentra una variable, decide dónde almacenarla, en la pila o en el montón. Este proceso se llama escape analysis.
Si la variable "se escapa" fuera de la función, se envía a la pila. Si no, permanece en la pila.
Ejemplo 1. Variable local (permanece en la pila)
func sum(a, b int) int {
c := a + b
return c
}
Ejemplo 2. La variable se va al montón
func makePointer() *int {
x := 42
return &x
}
Aquí x vuelve por el puntero. Después de salir de la función, la pila se borrará y el valor se perderá. Por lo tanto, x "huye" al montón para seguir viviendo.

Comprobamos el análisis de escape
go build -gcflags="-m" main.go
Ejemplo de salida:
./main.go:5:6: moved to heap: x
¿Cuándo se amontonan las variables?
Regresan de la función por el puntero.
Se guardan en el cierre.
Se transmiten a la interfaz (a veces).
El tamaño de la estructura es demasiado grande para caber en la pila.
Ejemplo 3. Cierre
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
Aquí sum se almacena en una pila porque es necesario que viva más tiempo que la función adder.
Pila vs. montón en la práctica
Características | Pila | Montón |
|---|---|---|
Tiempo de vida | Mientras se ejecuta la función | Antes del montaje de GC |
Velocidad de acceso | Muy rápida | Más lento |
Control | Automático | Recogedor de basura |
Dónde se almacenan | Variables locales | Punteros, ciclos, objetos de larga duración |
Cómo escribir código eficaz
Evite los indicadores innecesarios. Cuantos más indicadores haya, mayor será la posibilidad de que se amontonen.
Si es posible, utilice valores en lugar de enlaces.
Sigue el análisis de escape. A veces Go asigna memoria en la pila, aunque parece que no es necesario.
No tengas miedo de los montones demasiado grandes. La optimización es importante, pero la optimización prematura es mala.
Total
Comprender dónde se almacenan los datos en Go te permite escribir un código más eficiente. Escape analysis es una herramienta que decide el destino de cada variable. Y conociendo sus reglas, puedes evitar frenos inesperados debido a asignaciones innecesarias en la pila.
En Codice hay un curso completo sobre Go, desde los conceptos básicos hasta los temas avanzados. Analizamos la sintaxis, el trabajo con la memoria, la competitividad y escribimos miniproyectos que ayudarán a consolidar el conocimiento.
Y también tenemos un canal de telegram, donde discutimos ideas geniales, compartimos experiencias y analizamos juntos las tareas: aprender no solo es útil, sino también divertido.
