> Напиши функцию на Go, которая принимает слайс каналов int и возвращает канал с суммами чисел из каждого канала (Go)

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

Компании: sferaplatform.ru

Стек: Go

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

Вот реализация функции на Go, которая принимает слайс каналов int и возвращает канал с суммами чисел из каждого канала:

GO
package main
import (
"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 := 0
for 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 <- 1
ch1 <- 2
close(ch1)
}()
go func() {
ch2 <- 3
ch2 <- 4
close(ch2)
}()
result := sumChannels([]<-chan int{ch1, ch2})
for sum := range result {
fmt.Println(sum) // Выведет: 3 (1+2) и 7 (3+4)
}
}

Объяснение:

  • Функция принимает []<-chan int - слайс каналов только для чтения.

  • Для каждого канала запускается горутина, которая суммирует все значения из него и отправляет сумму в результирующий канал.

  • Используется sync.WaitGroup для ожидания завершения всех горутин.

  • После завершения всех горутин результирующий канал закрывается, чтобы сигнализировать об окончании данных.

  • Функция возвращает канал, из которого можно читать суммы в произвольном порядке (порядок не гарантируется, так как горутины выполняются конкурентно).

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

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