Sobes.tech
Middle

O que é um closure em Go e como funciona?

sobes.tech IA

Resposta da IA

O encerramento em Go é uma função que "lembra" o valor das variáveis do seu ambiente léxico, mesmo após esse ambiente deixar de existir.

O princípio de funcionamento é o seguinte:

  1. Quando um encerramento é criado (por exemplo, dentro de outra função), ele captura referências às variáveis do escopo onde foi declarado.
  2. Essas variáveis capturadas permanecem vivas enquanto o encerramento existir, mesmo que a função onde foram declaradas já tenha terminado.
  3. A cada chamada do encerramento, ele pode acessar e modificar essas variáveis capturadas.

Exemplo:

package main

import "fmt"

func makeCounter() func() int {
	count := 0 // Variável do ambiente externo
	return func() int { // Este é um encerramento
		count++ // Ele acessa e modifica `count`
		return count
	}
}

func main() {
	counter1 := makeCounter()
	fmt.Println(counter1()) // Imprime 1
	fmt.Println(counter1()) // Imprime 2

	counter2 := makeCounter() // Cria um novo encerramento com seu próprio `count`
	fmt.Println(counter2()) // Imprime 1
}

Neste exemplo, a função makeCounter retorna uma função (encerramento). Este encerramento "captura" a variável count. Cada chamada à função retornada aumenta o valor de count, que pertence a essa instância específica do encerramento.