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 } Implemente a função merge que aceita múltiplos canais de inteiros e retorna um único canal que mescla os valores de todos os canais de entrada. O canal mesclado deve fechar quando todos os canais de entrada estiverem fechados.

sobes.tech IA

Resposta da IA

A função merge deve aceitar vários canais chan int e retornar um único canal, no qual todos os valores dos canais de entrada serão enviados. Quando todos os canais de entrada estiverem fechados, o canal de saída também deve fechar.

A implementação geralmente baseia-se no uso de sync.WaitGroup para acompanhar o encerramento de todos os canais e no lançamento de goroutines para ler de cada canal.

Exemplo de implementação:

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

    // Função para copiar valores de um canal para 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)
    }

    // Fecha out após todas as goroutines terminarem
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Esta abordagem garante que todos os valores dos canais de entrada cheguem ao canal de saída, e que o canal de saída seja fechado após o encerramento de todos os canais de entrada.