Выбор ответа Junior Горутины и планировщик GMP спрашивают часто обновлено

Переменная цикла и горутины в Go 1.22

Вопрос

Модуль объявляет go 1.23. Что напечатает код (порядок строк не важен)?

var wg sync.WaitGroup
for i := 0; i < 3; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()
        fmt.Println(i)
    }()
}
wg.Wait()

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Числа 0, 1, 2 в каком-то порядке. С Go 1.22 переменная цикла for i := ... создаётся заново на каждой итерации, и каждое замыкание видит своё значение.

Варианты ответа

  1. Числа 0, 1, 2 в каком-то порядкеправильный ответ
  2. Три раза 3: замыкания видят общее i
  3. Три раза 2: последнее значение i
  4. Ничего, потому что горутины не успеют

Разбор

С Go 1.22 переменная цикла for i := ... создаётся заново на каждой итерации, и каждое замыкание видит своё значение. Три тройки печаталось в старых версиях (до 1.22 или если в go.mod указана версия ниже 1.22). WaitGroup гарантирует, что горутины доработают.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.