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

  1. Když je vytvořen uzávěr (například uvnitř jiné funkce), zachytí odkazy na proměnné z oblasti, ve které byl deklarován.
  2. 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.
  3. 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.