Sobes.tech
Middle

Čo je uzáver (closure) v Go a ako funguje?

sobes.tech AI

Odpoveď od AI

Zatvorenie v Go je funkcia, ktorá "pamätá" hodnotu premenných z jej lexikálneho prostredia, aj po tom, čo toto prostredie prestane existovať.

Princíp fungovania je nasledovný:

  1. Keď je vytvorené zatvorenie (napríklad vo vnútri inej funkcie), zachytáva odkazy na premenné z oblasti, v ktorej bolo deklarované.
  2. Tieto zachytené premenné zostávajú živé, kým zatvorenie existuje, aj keď funkcia, v ktorej boli deklarované, už skončila.
  3. Pri každom volaní zatvorenia, môže pristupovať k týmto zachyteným premenným a meniť ich.

Príklad:

package main

import "fmt"

func makeCounter() func() int {
	count := 0 // Vonkajšia premenná
	return func() int { // Toto je zatvorenie
		count++ // Pristupuje k `count` a mení ho
		return count
	}
}

func main() {
	counter1 := makeCounter()
	fmt.Println(counter1()) // Vypíše 1
	fmt.Println(counter1()) // Vypíše 2

	counter2 := makeCounter() // Vytvorí nové zatvorenie s vlastným `count`
	fmt.Println(counter2()) // Vypíše 1
}

V tomto príklade funkcia makeCounter vracia funkciu (zatvorenie). Toto zatvorenie "zachytáva" premennú count. Každé volanie vrátenej funkcie zvyšuje hodnotu count, ktorá patrí tejto konkrétnej inštancii zatvorenia.