Ответ
Да, приходилось. Каналы удобны для коммуникации между горутинами, но имеют накладные расходы на синхронизацию. В высоконагруженных системах иногда лучше использовать sync.Mutex или atomic для shared memory.
Пример, где sync.Mutex может быть быстрее:
var counter int
var mu sync.Mutex
func increment() {
mu.Lock()
counter++
mu.Unlock()
}
Плюсы отказа от каналов:
- Меньше аллокаций
- Нет блокировок горутин
- Прямой доступ к памяти
Но важно помнить:
- Каналы безопаснее по умолчанию
- Shared memory сложнее в отладке
- Для простых случаев разница незначительна
Оптимизировать стоит только после профилирования.