Sobes.tech
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:

  1. Kada se kreira zatvaranje (npr. unutar druge funkcije), ono hvata reference na promenljive iz opsega u kojem je deklarisano.
  2. Ove uhvaćene promenljive ostaju žive dok zatvaranje postoji, čak i ako funkcija u kojoj su deklarisane već završila.
  3. 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.