Замыкание — функция, которая захватывает переменные из внешней области видимости. Она «замыкает» их на себя и работает с ними по ссылке.
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 переменная цикла создаётся заново на каждой итерации.