Назад к вопросам
СБЕР
Middle+
1
Задача 3: Найти ошибки в коде с горутинами, map и WaitGroup
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
При работе с горутинами, map и sync.WaitGroup в Go часто встречаются следующие ошибки:
-
Параллельный доступ к map без синхронизации — map в Go не является потокобезопасным, и одновременное чтение/запись из разных горутин приводит к панике.
-
Неправильное использование WaitGroup — например, вызов
wg.Done()меньшее или большее количество раз, чемwg.Add(), или вызовwg.Wait()до запуска всех горутин. -
Передача переменных цикла в горутину по ссылке — все горутины могут получить одну и ту же переменную, что приводит к неправильным результатам.
Пример исправленного кода:
var mu sync.Mutex
var wg sync.WaitGroup
results := make(map[int]int)
for i := 0; i < 10; i++ {
wg.Add(1)
i := i // локальная копия переменной
go func() {
defer wg.Done()
value := i * 2
mu.Lock()
results[i] = value
mu.Unlock()
}()
}
wg.Wait()
Здесь:
- Создаётся локальная копия
iдля каждой горутины. - Используется мьютекс
muдля безопасного доступа к map. wg.Add(1)вызывается перед запуском горутины,wg.Done()— внутри неё.
Это предотвращает гонки данных и обеспечивает корректное завершение всех горутин.