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 } Implementirajte 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 АИ

Одговор од АИ

Funkcija merge treba da prihvati nekoliko kanala chan int i da vrati jedan kanal, u koji će biti poslata sve vrednosti iz ulaznih kanala. Kada su svi ulazni kanali zatvoreni, i izlazni kanal treba da se zatvori.

Implementacija se obično zasniva na korišćenju sync.WaitGroup za praćenje zatvaranja svih kanala i pokretanju gorutina za čitanje iz svakog kanala.

Primer implementacije:

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

    // Funkcija za kopiranje vrednosti iz jednog kanala u 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)
    }

    // Zatvaramo out nakon što sve gorutine završe
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Ovaj pristup garantuje da će sve vrednosti iz ulaznih kanala stići do izlaznog kanala, a izlazni kanal će biti zatvoren nakon zatvaranja svih ulaznih kanala.