> Как читать данные из двух каналов одновременно без использования горутин (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Black Wall Group (BWG)

Стек: Go

> Пример ответа

В Go для одновременного чтения из двух каналов без использования горутин можно применить конструкцию select. Она позволяет ожидать данные из нескольких каналов и обрабатывать их по мере готовности. Пример:

GO
package main
import "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:

GO
select {
case val := <-ch1:
// обработка
case val := <-ch2:
// обработка
default:
// действия, если ни один канал не готов
}

Важно: select работает в рамках одной горутины (например, в main), поэтому он не требует создания дополнительных горутин для чтения. Однако сами каналы должны быть заполнены из других горутин - иначе чтение заблокируется навсегда.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью