Что такое замыкание (closure) в Go?

Junior
1.2k просмотров
AFK Offer AI

Замыкание — функция, которая захватывает переменные из внешней области видимости. Она «замыкает» их на себя и работает с ними по ссылке.

func counter() func() int {
    n := 0
    return func() int {
        n++ // захватывает n из внешней функции
        return n
    }
}

c := counter() fmt.Println(c()) // 1 fmt.Println(c()) // 2

Ловушка в цикле — переменная цикла одна на все итерации (до Go 1.22):

for i := 0; i < 3; i++ {
    go func() {
        fmt.Println(i) // все напечатают 3!
    }()
}

// Фикс: передать как аргумент for i := 0; i < 3; i++ { go func(i int) { fmt.Println(i) // 0, 1, 2 }(i) }

С Go 1.22 переменная цикла создаётся заново на каждой итерации.

Следующий вопрос

Что делает функция copy?