Нужно дождаться всех горутин и передавать индекс явно. В старой семантике Go есть захват общей переменной, а в Go 1.22+ для такого цикла остаётся проблема преждевременного выхода main.
Правильный вывод значений из множества горутин
Нужно дождаться всех горутин и передавать индекс явно. В старой семантике Go есть захват общей переменной, а в Go 1.22+ для такого цикла остаётся проблема преждевременного выхода main.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо запустить сто горутин, при этом каждая горутина должна вывести своё уникальное число. Ожидается, что порядок вывода будет произвольным, однако полученный результат отличается от ожидаемого. Требуется выявить причину некорректного вывода и предложить рабочее решение, обеспечивающее корректный вывод значений.
package main
import (
"fmt"
)
func main() {
cnt := 100
for i := 0; i < cnt; i++ {
go func() {
fmt.Println(i)
}()
}
}
Ответ
Нужно дождаться всех горутин и передавать индекс явно. В старой семантике Go есть захват общей переменной, а в Go 1.22+ для такого цикла остаётся проблема преждевременного выхода main.
Добавьте sync к импортам:
func main() {
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func(value int) {
defer wg.Done()
fmt.Println(value)
}(i)
}
wg.Wait()
}
Будут выведены все числа 0–99 ровно по одному разу, порядок произвольный. Add вызывается до запуска, иначе Wait мог бы увидеть нулевой счётчик раньше регистрации работы.