Sobes.tech
Senior
30

// 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 } Implement the function merge that takes multiple channels of integers and returns a single channel that merges the values from all input channels. The merged channel should close when all input channels are closed.

Сұралған компаниялар
Не указано

AI-дан жауап

sobes.tech 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
}

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