Программа не компилируется из-за wg.Wait без скобок. После замены на wg.Wait() остаются конкурентные записи в map: WaitGroup не защищает сам контейнер.
Что покажет вывод программы №39
Программа не компилируется из-за wg.Wait без скобок. После замены на wg.Wait() остаются конкурентные записи в map: WaitGroup не защищает сам контейнер.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой результат будет напечатан при запуске следующей программы?
import (
"fmt"
"sync"
)
func main () {
var wg sync.WaitGroup
m := make(map[int]int)
for i := 0 ; i < 10; i++{
wg.Add(1)
go func(key int) {
defer wg.Done()
m[key] = key * key
}(i)
}
wg.Wait
for key, val := range m{
fmt.Printf("Key; %d, Value: %d\n", key, val)
}
}
Ответ
Программа не компилируется из-за wg.Wait без скобок. После замены на wg.Wait() остаются конкурентные записи в map: WaitGroup не защищает сам контейнер.
Добавьте var mu sync.Mutex и окружите m[key] = key*key вызовами mu.Lock()/mu.Unlock(). После ожидания можно безопасно обходить map. В ней будут квадраты ключей 0–9: от 0 до 81, порядок обхода не гарантирован. Без mutex возможны data race и fatal error concurrent map writes, даже если ключи различаются.