Sobes.tech
Middle+

Waar bevindt de variabele zich wanneer deze wordt uitgelicht in een goroutine?

sobes.tech AI

Antwoord van AI

Een variabele kan worden toegewezen aan zowel de stack van een goroutine als aan de heap. Dit wordt bepaald door het mechanisme van escape analysis (escape-analyse) van de Go-compiler.

Basisprincipes van escape analysis:

  • Als de compiler kan bewijzen dat de variabele alleen binnen een functieverzoek of alleen binnen de stack van een goroutine leeft (d.w.z. dat er geen verwijzingen van buitenaf naar zijn), wordt deze op de stack van die goroutine toegewezen. Dit is sneller, omdat de stack automatisch wordt beheerd en geen garbage collection vereist.
  • Als de compiler niet kan bewijzen dat de variabele beperkt is tot de stack, of als er verwijzingen van buitenaf naar zijn (bijvoorbeeld, door een pointer naar een andere functie, geschreven in een globale variabele, geretourneerd uit een functie via een pointer), wordt deze op de heap toegewezen. De heap vereist garbage collection, wat de uitvoering kan vertragen.

Voorbeeld van toewijzing op de stack:

// De variabele 'x' wordt op de stack van de goroutine toegewezen, omdat deze alleen binnen de functie wordt gebruikt.
func exampleStack() int {
	x := 10
	return x
}

Voorbeeld van toewijzing op de heap:

// De variabele 'p' (pointer naar int) en de int waarnaar hij wijst, kunnen op de heap worden toegewezen.
// Dit gebeurt omdat de pointer wordt geretourneerd uit de functie en van buitenaf kan worden gebruikt.
func exampleHeap() *int {
	x := 20 // De waarde 20 kan op de heap worden toegewezen
	return &x // Retourneer het adres van de variabele x
}

Escape analysis vindt plaats tijdens het compileren. Het kan worden gecontroleerd met de vlag -gcflags "-m":

go build -gcflags "-m" your_package_name

De uitvoer van de compiler toont welke variabelen "escape to heap".

Dus, de locatie van de variabele (stack vs heap) wordt niet bepaald door of de variabele wordt toegewezen in een goroutine, maar door hoe de Go-compiler haar levenscyclus en scope analyseert.