Связь между горутинами в Go обычно организуется через каналы (channels). Каналы позволяют безопасно передавать данные между горутинами и синхронизировать их работу.
Как организовать связь между горутинами и как работать с дедлоками?
Связь между горутинами в Go обычно организуется через каналы (channels). Каналы позволяют безопасно передавать данные между горутинами и синхронизировать их работу.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Связь между горутинами в Go обычно организуется через каналы (channels). Каналы позволяют безопасно передавать данные между горутинами и синхронизировать их работу.
Пример передачи данных через канал:
ch := make(chan int)
go func() {
ch <- 42 // отправка значения
}()
val := <-ch // получение значения
Чтобы избежать дедлоков (deadlocks), нужно:
- Убедиться, что для каждого отправителя есть получатель и наоборот.
- Не блокировать горутину навсегда, ожидая данные, которые никогда не придут.
- Использовать буферизированные каналы, если нужно избежать блокировки при отправке.
- При использовании
selectпредусматривать default или таймауты.
Дедлок возникает, когда горутина навсегда блокируется, ожидая событие, которое не произойдет. В Go runtime обнаруживает дедлок и выдает panic.