Выбор ответа 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 := ... создаётся заново на каждой итерации, и каждое замыкание видит своё значение.
Варианты ответа
- Числа 0, 1, 2 в каком-то порядкеправильный ответ
- Три раза 3: замыкания видят общее i
- Три раза 2: последнее значение i
- Ничего, потому что горутины не успеют
Разбор
С Go 1.22 переменная цикла for i := ... создаётся заново на каждой итерации, и каждое замыкание видит своё значение. Три тройки печаталось в старых версиях (до 1.22 или если в go.mod указана версия ниже 1.22). WaitGroup гарантирует, что горутины доработают.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.