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 } Implementige funktsiooni merge, mis võtab vastu mitu täisarvude kanalit ja tagastab ühe kanali, mis ühendab kõigi sisendkanalite väärtused. Ühendatud kanal peaks sulguma, kui kõik sisendkanalid on suletud.
sobes.tech AI
Vastus AI-lt
Funktsioon merge peaks vastu võtma mitu chan int kanalit ja tagastama ühe kanali, kuhu saadetakse kõik sisendkanalite väärtused. Kui kõik sisendkanalid on suletud, peaks ka väljundkanal sulguma.
Tavaliselt põhineb see sync.WaitGroup kasutamisel, et jälgida kõigi kanalite sulgemist ning käivitada goroutine'id iga kanali lugemiseks.
Näide:
func merge(chans ...chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Funktsioon väärtuste kopeerimiseks ühest kanalist teise
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)
}
// Sulgeme out pärast kõigi goroutine'ide lõpetamist
go func() {
wg.Wait()
close(out)
}()
return out
}
See lähenemine tagab, et kõik sisendkanalite väärtused jõuavad väljundkanalisse ning väljundkanal suletakse pärast kõigi sisendkanalite sulgemist.