Middle
Šta je zatvaranje (closure) u Go i kako funkcioniše?
sobes.tech АИ
Одговор од АИ
Zatvaranje u Go je funkcija koja "pamti" vrednost promenljivih iz njenog leksičkog okruženja, čak i nakon što to okruženje prestane da postoji.
Princip rada je sledeći:
- Kada se kreira zatvaranje (npr. unutar druge funkcije), ono hvata reference na promenljive iz opsega u kojem je deklarisano.
- Ove uhvaćene promenljive ostaju žive dok zatvaranje postoji, čak i ako funkcija u kojoj su deklarisane već završila.
- Pri svakom pozivu zatvaranja, ono može pristupiti i menjati ove uhvaćene promenljive.
Primer:
package main
import "fmt"
func makeCounter() func() int {
count := 0 // Promenljiva iz spoljnog okruženja
return func() int { // Ovo je zatvaranje
count++ // Pristupa i menja `count`
return count
}
}
func main() {
counter1 := makeCounter()
fmt.Println(counter1()) // Ispisaće 1
fmt.Println(counter1()) // Ispisaće 2
counter2 := makeCounter() // Kreira novo zatvaranje sa sopstvenim `count`
fmt.Println(counter2()) // Ispisaće 1
}
U ovom primeru, funkcija makeCounter vraća funkciju (zatvaranje). Ovo zatvaranje "uhvata" promenljivu count. Svaki poziv vraćene funkcije povećava vrednost count, koja pripada ovom specifičnom primeru zatvaranja.