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 } Valósítsa meg a merge függvényt, amely több egész csatornát fogad és egyetlen csatornát ad vissza, amely összefűzi az összes bemeneti csatorna értékeit. A összefűzött csatornának akkor kell bezáródnia, amikor az összes bemeneti csatorna bezáródott.

sobes.tech MI

Válasz az MI-től

A merge függvénynek több chan int csatornát kell fogadnia, és egy olyan csatornát kell visszaadnia, amelybe az összes bemeneti csatorna értékei kerülnek. Amikor minden bemeneti csatorna bezárul, a kimeneti csatornának is be kell zárulnia.

Az implementáció általában a sync.WaitGroup használatán alapul, hogy nyomon kövesse az összes csatorna bezárását, és goroutine-okat indít minden csatornáról való olvasáshoz.

Példa az implementációra:

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

    // Funkció az értékek másolására egy csatornából a out-ba
    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)
    }

    // A out csatorna bezárása, miután minden goroutine befejeződött
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Ez a megközelítés garantálja, hogy minden bemeneti csatorna értéke eljusson a kimeneti csatornára, és a kimeneti csatorna bezárul, miután minden bemeneti csatorna bezárult.