go
package main
import (
"fmt"
)
func main() {
funcs := []func(){}
for i := 0; i < 3; i++ {
funcs = append(funcs, func() {
fmt.Println(i)
})
}
for _, f := range funcs {
f()
}
}
❓ Варианты:
A)0 1 2
B)3 3 3
C) Паника на runtime
D) 0 0 0
💡 Пиши свой ответ в комментариях, и объясни почему!
✅ Правильный ответ:
🔍 Почему так происходит:
В этом коде создаётся срез из замыканий, и каждый func() внутри цикла ссылается на одну и ту же переменную i.
Ключевой момент: i не копируется при каждой итерации цикла, а продолжает изменяться, и все функции “запоминают” ссылку на одну и ту же i, а не её значение на момент создания.
К моменту вызова всех функций (f() в конце) цикл уже завершён, и значение i стало 3.
👉 Поэтому каждая функция выводит 3, а не 0, 1, 2.
@golangtests