Даже опытные разработчики совершают ошибки при работе с параллельностью в Go. Вот самые частые проблемы:
Забывают закрывать каналы. Открыли
chan, начали отправлять — и всё. А в другом месте кто-то ждёт данных и зависает, потому что канал не закрыт. Итог —
утечка памяти или блокировка.
Используют
time.Sleep вместо
sync.WaitGroup. Это ненадёжно. Лучше использовать
sync.WaitGroup, чтобы дождаться завершения горутин корректно.
Блокируют горутины навсегда. Если канал нечитабельный или переполнен — горутина может зависнуть. Такое бывает, если:
- канал не читает никто;
- буфер заполнен;
- нет select с default-веткой.
Путают каналы и мьютексы. Каналы — не замена мьютексам
(sync.Mutex). Они хорошо работают для
передачи данных, но не для защиты от одновременного доступа к переменной.
Если нужно защитить состояние — используй мьютекс.Если передать результат — используй канал.