package main
import "fmt"
func main() {
var funcs []func()
for i := range 3 {
funcs = append(funcs, func() {
fmt.Println(i)
})
}
for _, f := range funcs {
f()
}
}
Что будет в выводе?
A)
0
0
0
😎
2
2
2
C)
0
1
2
D) Код не скомпилируется
Правильный ответ: C — 0, 1, 2
Почему?
В современных версиях Go переменная цикла для каждой итерации получает отдельное значение для замыканий.
Плюс range теперь можно использовать прямо по integer:
```go
for i := range 3
```
Это даёт значения:
```go
0
1
2
```
Поэтому каждое замыкание запоминает своё i.
Несколько лет назад похожие примеры часто ломались из-за захвата одной общей переменной цикла, и разработчики писали:
```go
i := i
```
внутри цикла.
Хороший вопрос на собеседовании:
Почему этот код сегодня выводит 0, 1, 2, хотя раньше похожий пример мог вести себя иначе?