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 } Izpildiet funkciju merge, kas pieņem vairākus veselo skaitļu kanālus un atgriež vienu kanālu, kas apvieno visu ievades kanālu vērtības. Apvienotajam kanālam jāaizveras, kad visi ievades kanāli ir aizvērti.

sobes.tech AI

Atbilde no AI

Funkcija merge jāņem vairākus chan int kanālus un jāatgriež viens kanāls, kurā tiks nosūtītas visas ieejas kanālu vērtības. Kad visi ieejas kanāli tiks slēgti, arī izejas kanālam jābūt slēgtam.

Implementācija parasti balstās uz sync.WaitGroup izmantošanu, lai uzraudzītu visu kanālu slēgšanu un palaistu goroutines, lai lasītu no katra kanāla.

Piemērs:

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

    // Funkcija, lai kopētu vērtības no viena kanāla uz 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)
    }

    // Aizver out pēc visu goroutine pabeigšanas
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Šī pieeja nodrošina, ka visas ieejas kanālu vērtības nonāk izejas kanālā, un izejas kanāls tiks aizvērts pēc visu ieejas kanālu aizvēršanas.