Что выведет этот код с closure?

Middle
268 просмотров
AFK Offer AI

Пример: funcs := make([]func(), 3); for i := 0; i < 3; i++ { funcs[i] = func() { fmt.Println(i) } }; for _, f := range funcs { f() }. До Go 1.22: 3, 3, 3 — все closure ссылаются на одну переменную i, которая после цикла равна 3. С Go 1.22+: 0, 1, 2 — каждая итерация создаёт свою переменную. Фикс для старых версий: v := i; funcs[i] = func() { fmt.Println(v) }. Это одна из самых частых ловушек Go — closure захватывает переменную, а не значение.

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

Когда использовать new?