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 } Zaimplementuj funkcję merge, która przyjmuje wiele kanałów typu int i zwraca pojedynczy kanał, który łączy wartości ze wszystkich kanałów wejściowych. Po zamknięciu wszystkich kanałów wejściowych, kanał wyjściowy powinien się zamknąć.
sobes.tech AI
Odpowiedź od AI
Funkcja merge powinna przyjmować kilka kanałów chan int i zwracać jeden kanał, do którego będą wysyłane wszystkie wartości z kanałów wejściowych. Gdy wszystkie kanały wejściowe zostaną zamknięte, kanał wyjściowy również powinien się zamknąć.
Implementacja zazwyczaj opiera się na użyciu sync.WaitGroup do śledzenia zamknięcia wszystkich kanałów oraz uruchamianiu goroutine do czytania z każdego kanału.
Przykład implementacji:
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Funkcja do kopiowania wartości z jednego kanału do 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)
}
// Zamknięcie out po zakończeniu wszystkich goroutine'ów
go func() {
wg.Wait()
close(out)
}()
return out
}
Ten sposób gwarantuje, że wszystkie wartości z kanałów wejściowych trafią do kanału wyjściowego, a kanał wyjściowy zostanie zamknięty po zamknięciu wszystkich kanałów wejściowych.