Строка 1 гарантированно предшествует 3, потому что main ждёт соответствующий Done. Строка 2 обычно появляется первой, но WaitGroup эту вторую горутину не учитывает.
Последовательность вывода из горутин
Строка 1 гарантированно предшествует 3, потому что main ждёт соответствующий Done. Строка 2 обычно появляется первой, но WaitGroup эту вторую горутину не учитывает.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какие строки будут напечатаны и в каком порядке.
func main() {
runtime.GOMAXPROCS(1)
var wgCounter sync.WaitGroup
wgCounter.Add(1)
go func() {
time.Sleep(time.Second * 2)
fmt.Println("1")
wgCounter.Done()
}()
go func() {
fmt.Println("2")
}()
wgCounter.Wait()
fmt.Println("3")
}
Ответ
Строка 1 гарантированно предшествует 3, потому что main ждёт соответствующий Done. Строка 2 обычно появляется первой, но WaitGroup эту вторую горутину не учитывает.
GOMAXPROCS(1) не задаёт строгий порядок запуска. В типичном выполнении будет 2, затем после паузы 1 и 3, однако вывод 2 до завершения процесса не является гарантией данного кода. Если нужно дождаться обеих горутин, добавьте обе в WaitGroup. Для фиксированной последовательности 2→1→3 требуется отдельная зависимость.