Sobes.tech
Middle+

Onde está a variável quando ela é destacada numa goroutine?

sobes.tech IA

Resposta da IA

Uma variável pode ser alocada tanto na pilha de uma goroutine quanto no heap. Isso é determinado pelo mecanismo de escape analysis (análise de escape) do compilador Go.

Princípios básicos da escape analysis:

  • Se o compilador puder provar que a variável vive apenas dentro de uma chamada de função ou apenas dentro do escopo da pilha de uma goroutine (ou seja, não faz referência a ela de fora), ela é alocada na pilha dessa goroutine. Isso é mais rápido, pois a pilha é gerenciada automaticamente e não requer coleta de lixo.
  • Se o compilador não puder provar que a variável está limitada à pilha, ou se há referências a ela de fora (por exemplo, passada por ponteiro para outra função, escrita em uma variável global, retornada de uma função por ponteiro), ela é alocada no heap. O heap requer coleta de lixo, o que pode desacelerar a execução.

Exemplo de alocação na pilha:

// A variável 'x' é alocada na pilha da goroutine, pois é usada apenas dentro da função.
func exampleStack() int {
	x := 10
	return x
}

Exemplo de alocação no heap:

// A variável 'p' (ponteiro para int) e o int ao qual ela aponta podem ser alocados no heap.
// Isso acontece porque o ponteiro é retornado da função e pode ser usado de fora.
func exampleHeap() *int {
	x := 20 // O valor 20 pode ser alocado no heap
	return &x // Retorna o endereço da variável x
}

A análise de escape ocorre durante a compilação. Pode ser verificada usando a flag -gcflags "-m":

go build -gcflags "-m" your_package_name

A saída do compilador mostrará quais variáveis "escape to heap".

Assim, a localização da variável (pilha vs heap) não é determinada pelo fato de a variável ser alocada na goroutine, mas por como o compilador Go analisa seu ciclo de vida e escopo.