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 } Имплементирајте ја функцијата merge која зема повеќе канали на цели броеви и враќа еден канал кој ги спојува вредностите од сите влезни канали. Спојениот канал треба да се затвори кога сите влезни канали ќе бидат затворени.

sobes.tech AI

Ҷавоб аз AI

Функсия merge трябва да приема няколко chan int канала и да връща един канал, в който ще се изпращат всички стойности от входните канали. Когато всички входни канали са затворени, и изходният канал трябва да се затвори.

Обикновено реализацията се базира на използването на sync.WaitGroup за проследяване на затварянето на всички канали и стартиране на горутини за четене от всеки канал.

Пример за реализация:

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

    // Функция за копиране на стойности от един канал в 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)
    }

    // Затваряме out след като всички горутини приключат
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Този подход гарантира, че всички стойности от входните канали ще достигнат до изходния канал, а изходният канал ще се затвори след затварянето на всички входни канали.