Go est un langage souvent qualifié de simple et rapide. Mais sous le capot, il fait beaucoup de magie, surtout quand il s'agit de travailler avec la mémoire. Comprendre où et comment les données sont stockées peut aider à écrire un code plus efficace, à éviter les allocations inutiles et à mieux comprendre le comportement du programme.
Pile et tas : les bases
Pile (stack) — mémoire qui fonctionne selon le principe LIFO (last in, first out). Les variables vivent jusqu'à la sortie de la fonction. Travailler avec une pile est rapide et presque gratuit.
Tas (heap) — espace mémoire pour les objets dont la durée de vie ne peut être déterminée à l'avance. Géré par le ramasse-miettes (GC). Les allocations sont plus coûteuses et l'assemblage peut ralentir le programme.
La principale différence : sur la pile, la mémoire est libérée automatiquement lorsque vous quittez la fonction, et dans le tas, le GC surveille cela.
Analyse d'évasion : qui s'est enfui dans la foule ?
Lorsque le compilateur Go rencontre une variable, il décide où la stocker - dans la pile ou dans le tas. Ce processus s'appelle escape analysis.
Si la variable « fuit » en dehors de la fonction, elle est envoyée dans la pile. Sinon, elle reste dans la pile.
Exemple 1. Variable locale (reste dans la pile)
func sum(a, b int) int {
c := a + b
return c
}
Exemple 2. La variable va dans la pile
func makePointer() *int {
x := 42
return &x
}
Ici, x renvoie le pointeur. Après avoir quitté la fonction, la pile sera effacée et la valeur serait perdue. Par conséquent, x « s'échappe » dans la pile pour continuer à vivre.

Vérification de l'analyse d'échappement
go build -gcflags="-m" main.go
Exemple de résultat :
./main.go:5:6: moved to heap: x
Quand les variables s'échappent-elles en tas ?
Retour de la fonction par pointeur.
Ils sont conservés dans la fermeture.
Transmis à l'interface (parfois).
La taille de la structure est trop grande pour tenir dans la pile.
Exemple 3. Fermeture
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
Ici, sum est stocké dans une pile, car il faut qu'il vive plus longtemps que la fonction adder.
Pile vs tas en pratique
Caractéristiques | Pile | Tas |
|---|---|---|
Durée de vie | Pendant que la fonction est en cours d'exécution | Avant l'assemblage GC |
Vitesse d'accès | Très rapide | Plus lentement |
Gestion | Automatique | Éboueur |
Où sont-ils stockés | Variables locales | Pointeurs, fermetures, objets à longue durée de vie |
Comment écrire un code efficace
Évitez les pointeurs inutiles. Plus il y a de panneaux, plus il y a de chances de se retrouver dans un tas.
Si possible, utilisez des valeurs plutôt que des liens.
Suivez l'analyse d'échappement. Parfois, Go alloue de la mémoire dans la pile, bien qu'il semble que cela ne soit pas nécessaire.
N'ayez pas trop peur des tas. L'optimisation est importante, mais l'optimisation prématurée est un mal.
Total
Comprendre où les données sont stockées dans Go vous permet d'écrire un code plus productif. Escape analysis est un outil qui décide du sort de chaque variable. Et en connaissant ses règles, vous pouvez éviter les freins inattendus dus à des allocations inutiles dans la pile.
Dans Codique Il existe un cours complet sur Go, des bases aux sujets avancés. Nous analysons la syntaxe, le travail avec la mémoire, la compétitivité et rédigeons des mini-projets qui aideront à consolider les connaissances.
Et nous avons aussi un chaîne de télégram, où nous discutons d'idées intéressantes, partageons nos expériences et analysons ensemble les tâches, apprendre devient non seulement utile, mais aussi amusant.
