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 } Implementujte funkciju merge koja prihvata više kanala celih brojeva i vraća jedan kanal koji spaja vrednosti sa svih ulaznih kanala. Spojeni kanal treba zatvoriti kada su svi ulazni kanali zatvoreni.

sobes.tech AI

Odpoveď od AI

Funkcia merge by mala prijať niekoľko kanálov chan int a vrátiť jeden kanál, do ktorého budú odoslané všetky hodnoty z vstupných kanálov. Keď sú všetky vstupné kanály zatvorené, aj výstupný kanál by sa mal zatvoriť.

Implementácia je zvyčajne založená na použití sync.WaitGroup na sledovanie zatvorenia všetkých kanálov a na spustenie gorutín na čítanie z každého kanála.

Príklad implementácie:

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

    // Funkcia na kopírovanie hodnôt z jedného kanála 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)
    }

    // Zatvárame out po dokončení všetkých gorutín
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Tento prístup zabezpečuje, že všetky hodnoty z vstupných kanálov sa dostanú do výstupného kanála a že výstupný kanál bude zatvorený po zatvorení všetkých vstupných kanálov.