Middle
Co je to uzávěr (closure) v Go a jak funguje?
sobes.tech AI
Odpověď od AI
Uzávěr v Go je funkce, která "pamatuje" hodnotu proměnných z jejího lexikálního prostředí, i po tom, co toto prostředí přestane existovat.
Princip fungování je následující:
- Když je vytvořen uzávěr (například uvnitř jiné funkce), zachytí odkazy na proměnné z oblasti, ve které byl deklarován.
- Tyto zachycené proměnné zůstávají živé tak dlouho, jak uzávěr existuje, i když funkce, ve které byly deklarovány, již skončila.
- Při každém volání uzávěru může přistupovat k těmto zachyceným proměnným a měnit je.
Příklad:
package main
import "fmt"
func makeCounter() func() int {
count := 0 // Proměnná z vnějšího prostředí
return func() int { // Toto je uzávěr
count++ // Přistupuje k `count` a mění ho
return count
}
}
func main() {
counter1 := makeCounter()
fmt.Println(counter1()) // Vypíše 1
fmt.Println(counter1()) // Vypíše 2
counter2 := makeCounter() // Vytvoří nový uzávěr s vlastním `count`
fmt.Println(counter2()) // Vypíše 1
}
V tomto příkladu funkce makeCounter vrací funkci (uzávěr). Tento uzávěr "zachytí" proměnnou count. Každé volání vrácené funkce zvyšuje hodnotu count, která patří této konkrétní instanci uzávěru.