Senior
// 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 } Реализирайте функцията merge, която приема няколко канала за цели числа и връща един канал, който обединява стойностите от всички входни канали. Обединеният канал трябва да се затваря, когато всички входни канали са затворени.
sobes.tech AI
Отговор от 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
}
Този подход гарантира, че всички стойности от входните канали ще достигнат до изходния канал, а изходният канал ще се затвори след затварянето на всички входни канали.