Senior
30
// 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.
Сұралған компаниялар
Не указано
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
}
Такой подход гарантирует, что все значения из входных каналов попадут в выходной канал, а выходной канал закроется после закрытия всех входных.