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:
- Gdy tworzone jest zamknięcie (np. wewnątrz innej funkcji), przechwytuje odwołania do zmiennych z zakresu, w którym zostało zadeklarowane.
- 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.
- 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.