Какой результат будет выведен в консоль в примере №16

В исходнике пропущены скобки у wg.Done(), поэтому он не компилируется. После исправления 1 гарантированно будет напечатано раньше 3.

Короткий ответ

Что ответить на собеседовании

В исходнике пропущены скобки у wg.Done(), поэтому он не компилируется. После исправления 1 гарантированно будет напечатано раньше 3.

Подробный разбор

Ответ с пояснениями

Условие

Какие строки появятся в выводе при выполнении следующей программы на Go:

import (
        "fmt"
        "runtime"
        "sync"
        "time"
        )

func main() {
    runtime.GOMAXPROCS(1)
    var wg sync.WaitGroup
    wg.Add(1)
    go func(){
        time.Sleep(time.Second * 2)
        fmt.Println("1")
        wg.Done        
    }()
    go func(){
        fmt.Println("2")
    }()
    wg.Wait()
    fmt.Println("3")        
            
}

Ответ

В исходнике пропущены скобки у wg.Done(), поэтому он не компилируется. После исправления 1 гарантированно будет напечатано раньше 3.

Первая горутина печатает 1, затем уменьшает счётчик WaitGroup, позволяя main вывести 3. Для второй горутины счётчик не увеличен: её печать 2 не входит в гарантии ожидания.

Обычно 2 успевает появиться первой, пока другая горутина спит две секунды, но полагаться на это как на контракт нельзя; main может завершиться без ожидаемого порядка. GOMAXPROCS(1) не делает выполнение последовательно заданным исходником. Для гарантированного вывода 2 включите вторую горутину в ожидание.

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

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

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

Подробнее