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 } Implementujte funkci merge, která přijímá více kanálů celých čísel a vrací jeden kanál, který slučuje hodnoty ze všech vstupních kanálů. Sloučený kanál by se měl uzavřít, když jsou všechny vstupní kanály uzavřeny.
sobes.tech AI
Odpověď od AI
Funkce merge by měla přijímat několik kanálů chan int a vracet jeden kanál, do kterého budou odesílány všechny hodnoty z vstupních kanálů. Když jsou všechny vstupní kanály uzavřeny, měl by být uzavřen i výstupní kanál.
Implementace je obvykle založena na použití sync.WaitGroup k sledování uzavření všech kanálů a na spuštění gorutin pro čtení z každého kanálu.
Příklad implementace:
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Funkce pro kopírování hodnot z jednoho kanálu 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)
}
// Uzavření out po dokončení všech gorutin
go func() {
wg.Wait()
close(out)
}()
return out
}
Tento přístup zajišťuje, že všechny hodnoty z vstupních kanálů dorazí do výstupního kanálu a že výstupní kanál bude uzavřen po uzavření všech vstupních kanálů.