Sobes.tech
Middle

Kas yra uždarymas (closure) Go kalboje ir kaip jis veikia?

sobes.tech AI

Atsakymas iš AI

Užraktas Go yra funkcija, kuri "atsimena" savo apylinkės leksinėje aplinkoje esančių kintamųjų reikšmes, net ir po to, kai ši aplinka nebėra.

Veikimo principas yra toks:

  1. Kai sukuriamas užraktas (pvz., kitame funkcijos viduje), jis įsitraukia į nuorodas į kintamuosius iš apylinkės, kurioje jis buvo deklaruotas.
  2. Šie įtraukti kintamieji lieka gyvi tol, kol egzistuoja užraktas, net ir jei funkcija, kurioje jie buvo deklaruoti, jau baigėsi.
  3. Kiekvieną kartą kviečiant užraktą, jis gali pasiekti ir keisti šiuos įtrauktus kintamuosius.

Pavyzdys:

package main

import "fmt"

func makeCounter() func() int {
	count := 0 // Išorinės aplinkos kintamasis
	return func() int { // Tai yra užraktas
		count++ // Jis pasiekia ir keičia `count`
		return count
	}
}

func main() {
	counter1 := makeCounter()
	fmt.Println(counter1()) // Išves 1
	fmt.Println(counter1()) // Išves 2

	counter2 := makeCounter() // Sukuria naują užraktą su savo `count`
	fmt.Println(counter2()) // Išves 1
}

Šiame pavyzdyje funkcija makeCounter grąžina funkciją (užraktą). Šis užraktas "suglaudžia" kintamąjį count. Kiekvieną kartą iškvietus grąžintą funkciją, count reikšmė didėja, priklausanti šiai konkrečiai užrakto kopijai.