Back to questions
Senior
5
// 2 func merge(chans ...chan int) <-chan int { panic("not implemented") } func main() { a,b,c := make(chan int), make(chan int), make(chan int) out := merge(a,b,c) go func(){ for v := range out { println(v) } }() a <- 1 a <- 2 a <- 3 b <- 4 c <- 5 close(c) a <- 6 } Implement the function merge that takes multiple channels of integers and returns a single channel that merges the values from all input channels. The merged channel should close when all input channels are closed.
Companies where asked
Не указано
Answer from AI
sobes.tech AI
Функция merge должна принимать несколько каналов chan int и возвращать один канал, в который будут отправляться все значения из входных каналов. Когда все входные каналы закрыты, выходной канал тоже должен закрыться.
Реализация обычно строится на использовании sync.WaitGroup для отслеживания закрытия всех каналов и запуска горутин для чтения из каждого канала.
Пример реализации:
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Функция для копирования значений из одного канала в out
output := func(c chan int) {
defer wg.Done()
for v := range c {
out <- v
}
}
wg.Add(len(chans))
for _, c := range chans {
go output(c)
}
// Закрываем out после того, как все горутины завершатся
go func() {
wg.Wait()
close(out)
}()
return out
}
Такой подход гарантирует, что все значения из входных каналов попадут в выходной канал, а выходной канал закроется после закрытия всех входных.