> Как читать данные из двух каналов одновременно без использования горутин (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Black Wall Group (BWG)
Стек: Go
> Пример ответа
В Go для одновременного чтения из двух каналов без использования горутин можно применить конструкцию select. Она позволяет ожидать данные из нескольких каналов и обрабатывать их по мере готовности. Пример:
GOpackage mainimport "fmt"func main() {ch1 := make(chan int)ch2 := make(chan string)// Запись данных в каналы (для демонстрации)go func() {ch1 <- 42}()go func() {ch2 <- "hello"}()// Чтение из двух каналов без горутинfor i := 0; i < 2; i++ {select {case val := <-ch1:fmt.Println("Получено из ch1:", val)case val := <-ch2:fmt.Println("Получено из ch2:", val)}}}
select блокирует выполнение до тех пор, пока один из каналов не станет доступным для чтения. Если нужно обрабатывать данные в неблокирующем режиме, можно добавить default:
GOselect {case val := <-ch1:// обработкаcase val := <-ch2:// обработкаdefault:// действия, если ни один канал не готов}
Важно: select работает в рамках одной горутины (например, в main), поэтому он не требует создания дополнительных горутин для чтения. Однако сами каналы должны быть заполнены из других горутин - иначе чтение заблокируется навсегда.
> Похожие задачи по Go
Почему интерфейсы лучше размещать в месте их применения?
Куда нужно положить интерфейс, если робот реализует интерфейс?
Зачем запускать много горутин на процессоре с ограниченным числом ядер
Какие приятные и неприятные моменты в работе программиста
> Похожие задачи по backend
Почему интерфейсы лучше размещать в месте их применения?
Куда нужно положить интерфейс, если робот реализует интерфейс?
Зачем запускать много горутин на процессоре с ограниченным числом ядер
Какие приятные и неприятные моменты в работе программиста
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью