Sobes.tech
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 } Implementeer de functie merge die meerdere kanalen van gehele getallen accepteert en een enkel kanaal retourneert dat de waarden van alle invoerkanalen samenvoegt. Het samengevoegde kanaal moet sluiten wanneer alle invoerkanalen gesloten zijn.

sobes.tech AI

Antwoord van AI

De merge-functie moet meerdere chan int-kanalen accepteren en één kanaal teruggeven, waarin alle waarden van de invoerkanalen worden verzonden. Wanneer alle invoerkanalen gesloten zijn, moet ook het uitvoerkanaal sluiten.

De implementatie is meestal gebaseerd op het gebruik van sync.WaitGroup om het sluiten van alle kanalen te volgen en het starten van goroutines om uit elk kanaal te lezen.

Voorbeeld van implementatie:

func merge(chans ...chan int) <-chan int {
    var wg sync.WaitGroup
    out := make(chan int)

    // Functie om waarden van een kanaal naar out te kopiëren
    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)
    }

    // Sluit out nadat alle goroutines klaar zijn
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Deze aanpak zorgt ervoor dat alle waarden uit de invoerkanalen in het uitvoerkanaal terechtkomen en dat het uitvoerkanaal wordt gesloten nadat alle invoerkanalen gesloten zijn.