Sobes.tech
Middle

Czym jest zamknięcie (closure) w Go i jak działa?

sobes.tech AI

Odpowiedź od AI

Zamknięcie w Go to funkcja, która "pamięta" wartość zmiennych z jej otoczenia leksykalnego, nawet po tym, jak to otoczenie przestanie istnieć.

Zasada działania jest następująca:

  1. Gdy tworzone jest zamknięcie (np. wewnątrz innej funkcji), przechwytuje odwołania do zmiennych z zakresu, w którym zostało zadeklarowane.
  2. Te przechwycone zmienne pozostają żywe tak długo, jak zamknięcie istnieje, nawet jeśli funkcja, w której zostały zadeklarowane, już się zakończyła.
  3. Przy każdym wywołaniu zamknięcia, może ono odwołać się do tych przechwyconych zmiennych i je modyfikować.

Przykład:

package main

import "fmt"

func makeCounter() func() int {
	count := 0 // Zmienna z otoczenia zewnętrznego
	return func() int { // To jest zamknięcie
		count++ // Odwołuje się do `count` i zmienia je
		return count
	}
}

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

	counter2 := makeCounter() // Tworzymy nowe zamknięcie z własnym `count`
	fmt.Println(counter2()) // Wypisze 1
}

W tym przykładzie funkcja makeCounter zwraca funkcję (zamknięcie). To zamknięcie "chwytuje" zmienną count. Każde wywołanie zwróconej funkcji zwiększa wartość count, należącą do tego konkretnego egzemplarza zamknięcia.