Назад к вопросам
Middle
104
questionbank

Что такое замыкание (closure) в Go и каков принцип его работы?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Замыкание в Go — это функция, которая "помнит" значение переменных из окружающего её лексического окружения, даже после того, как это окружение перестало существовать.

Принцип работы следующий:

  1. Когда замыкание создаётся (например, внутри другой функции), оно захватывает ссылки на переменные из области видимости, где оно было объявлено.
  2. Эти захваченные переменные живут до тех пор, пока живет замыкание, даже если функция, в которой они были объявлены, уже завершила работу.
  3. При каждом вызове замыкания оно может обращаться к этим захваченным переменным и изменять их.

Пример:

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, принадлежащее этому конкретному экземпляру замыкания.