Middle
Какво е затваряне (closure) в Go и как работи?
sobes.tech AI
Отговор от AI
Затварянето в Go е функция, която "помни" стойността на променливите от нейното лексикално обкръжение, дори след като това обкръжение вече не съществува.
Принципът на работа е следният:
- Когато се създаде затваряне (например, вътре в друга функция), то захваща препратки към променливите от областта, в която е било обявено.
- Тези захванати променливи остават живи, докато затварянето съществува, дори ако функцията, в която са били обявени, вече е приключила.
- При всяко извикване на затварянето, то може да достъпва и променя тези захванати променливи.
Пример:
package main
import "fmt"
func makeCounter() func() int {
count := 0 // Външна променлива
return func() int { // Това е затваряне
count++ // Достъпва и променя `count`
return count
}
}
func main() {
counter1 := makeCounter()
fmt.Println(counter1()) // Ще изведе 1
fmt.Println(counter1()) // Ще изведе 2
counter2 := makeCounter() // Създаваме ново затваряне с собствен `count`
fmt.Println(counter2()) // Ще изведе 1
}
В този пример функцията makeCounter връща функция (затваряне). Това затваряне "захваща" променливата count. Всеки път, когато се извика върнатата функция, стойността на count се увеличава, принадлежаща на този конкретен екземпляр на затварянето.