{}const=>[]async()letfn</>var
Développement

Mémoire en Go : comment fonctionne l'analyse d'échappement et où vont les variables

Nous analysons la pile et le tas en Go à l'aide d'exemples : pourquoi certaines variables ne vivent qu'à l'intérieur d'une fonction, tandis que d'autres s'échappent dans le tas.

К

Kodik

Auteur

3 min de lecture

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.

🔥 100 000+ étudiants déjà avec nous

Marre de lire la théorie ?
Il est temps de coder !

Kodik — une appli où tu apprends à coder par la pratique. Mentor IA, leçons interactives, projets réels.

🤖 IA 24/7
🎓 Certificats
💰 Gratuit
🚀 Commencer
Ont rejoint aujourd'hui

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.

🎯Arrête de reporter

Tu as aimé l'article ?
Place à la pratique !

Avec Kodik, tu ne lis pas seulement — tu codes immédiatement. Théorie + pratique = vraies compétences.

Pratique instantanée
🧠L'IA explique le code
🏆Certificat

Sans inscription • Sans carte