> Напиши функцию на Go, которая принимает слайс каналов int и возвращает канал с суммами чисел из каждого канала (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: sferaplatform.ru
Стек: Go
> Пример ответа
Вот реализация функции на Go, которая принимает слайс каналов int и возвращает канал с суммами чисел из каждого канала:
GOpackage mainimport ("fmt""sync")func sumChannels(channels []<-chan int) <-chan int {result := make(chan int)var wg sync.WaitGroup// Запускаем горутину для каждого входного каналаfor _, ch := range channels {wg.Add(1)go func(c <-chan int) {defer wg.Done()sum := 0for val := range c {sum += val}result <- sum}(ch)}// Закрываем result после завершения всех горутинgo func() {wg.Wait()close(result)}()return result}// Пример использованияfunc main() {ch1 := make(chan int)ch2 := make(chan int)go func() {ch1 <- 1ch1 <- 2close(ch1)}()go func() {ch2 <- 3ch2 <- 4close(ch2)}()result := sumChannels([]<-chan int{ch1, ch2})for sum := range result {fmt.Println(sum) // Выведет: 3 (1+2) и 7 (3+4)}}
Объяснение:
-
Функция принимает
[]<-chan int- слайс каналов только для чтения. -
Для каждого канала запускается горутина, которая суммирует все значения из него и отправляет сумму в результирующий канал.
-
Используется
sync.WaitGroupдля ожидания завершения всех горутин. -
После завершения всех горутин результирующий канал закрывается, чтобы сигнализировать об окончании данных.
-
Функция возвращает канал, из которого можно читать суммы в произвольном порядке (порядок не гарантируется, так как горутины выполняются конкурентно).
> Похожие задачи по backend
Как устроена пагинация в Go проектах
Как реализовать эффективную пагинацию с курсорами и индексами
Как гарантировать, что заказ не будет выполнен без исполнителя после резерва товара
Как снять бронь товара при отмене заказа
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью