Sobes.tech
Senior

Úkol na Merge channel Implementujte funkci merge, která přijímá libovolný počet kanálů chan string a vrací jeden výstupní kanál, ze kterého lze číst všechny hodnoty z předaných kanálů. Předané kanály mimo funkci merge se po zápisu uzavřou. Po dokončení čtení z sloučeného kanálu by měl program vypnout "ok".

sobes.tech AI

Odpověď od AI

Задача реализовать функцию merge, которая принимает несколько каналов (chan string) и возвращает один канал, из которого можно читать все значения из переданных каналов. После записи в каналы они закрываются, а после завершения чтения из объединённого канала выводится "ok".

Пример решения на Go:

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

    output := func(c <-chan string) {
        defer wg.Done()
        for val := range c {
            out <- val
        }
    }

    wg.Add(len(channels))
    for _, c := range channels {
        go output(c)
    }

    go func() {
        wg.Wait()
        close(out)
        fmt.Println("ok")
    }()

    return out
}

Объяснение:

  • Для каждого входного канала запускается горутина, которая читает из него и пишет в выходной канал.
  • Используется sync.WaitGroup, чтобы дождаться завершения чтения из всех каналов.
  • После закрытия всех входных каналов и завершения чтения выходной канал закрывается.
  • После закрытия выводится "ok".

Так можно объединить несколько каналов в один, сохраняя порядок чтения из каждого.