Правильный вывод значений из множества горутин

Нужно дождаться всех горутин и передавать индекс явно. В старой семантике 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 мог бы увидеть нулевой счётчик раньше регистрации работы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее