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 } Įgyvendinkite funkciją merge, kuri priima kelis sveikųjų skaičių kanalus ir grąžina vieną kanalą, kuris sujungia visas įvesties kanalų reikšmes. Sujungtas kanalas turi būti uždaromas, kai visi įvesties kanalai bus uždaryti.

sobes.tech AI

Atsakymas iš AI

Funkcija merge turėtų priimti kelis chan int kanalus ir grąžinti vieną kanalą, į kurį bus siunčiamos visos įėjimo kanalų reikšmės. Kai visi įėjimo kanalai bus uždaryti, ir išėjimo kanalas taip pat turi būti uždarytas.

Implementacija dažniausiai grindžiama sync.WaitGroup naudojimu stebėti visų kanalų uždarymą ir paleisti goroutines skaityti iš kiekvieno kanalo.

Pavyzdys:

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

    // Funkcija kopijuoti reikšmes iš vieno kanalo į 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)
    }

    // Uždaryti out po visų goroutine pabaigos
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Šis požiūris užtikrina, kad visi įėjimo kanalų reikšmės pasieks išėjimo kanalą, ir kad išėjimo kanalas bus uždarytas po visų įėjimo kanalų uždarymo.