В исходнике пропущены скобки у wg.Done(), поэтому он не компилируется. После исправления 1 гарантированно будет напечатано раньше 3.
Какой результат будет выведен в консоль в примере №16
В исходнике пропущены скобки у 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 включите вторую горутину в ожидание.