Ответ
Каналы в Go обеспечивают безопасный способ обмена данными между горутинами, предотвращая race conditions. Они синхронизируют выполнение горутин и позволяют передавать данные без явного использования мьютексов.
Пример:
ch := make(chan int)
go func() {
ch <- 42 // Отправка данных в канал
}()
value := <-ch // Получение данных из канала
fmt.Println(value) // 42
Плюсы:
- Безопасность: каналы гарантируют, что данные не будут испорчены при конкурентном доступе.
- Синхронизация: отправка/получение блокирует горутины, пока операция не завершится.
- Читаемость: код с каналами проще понять, чем с мьютексами.
Когда использовать:
- Для передачи данных между горутинами.
- Для синхронизации выполнения (например, ожидания завершения).
Альтернатива: sync.Mutex, но он сложнее в поддержке и подвержен ошибкам.