Sobes.tech
Senior

Merge არხის დავალება შეასრულეთ merge ფუნქცია, რომელიც იღებს ნებისმიერი რაოდენობის chan string არხებს და აბრუნებს ერთ გამოსავალ არხს, საიდანაც შეიძლება წაიკითხოთ ყველა გადაცემული არხის მნიშვნელობები. გადაცემული არხები გარეთ merge ფუნქციიდან იკეტება შემდეგი წერის შემდეგ. შეერთებული არხიდან წაკითხვის დასრულების შემდეგ, პროგრამამ უნდა გამოიტანოს "ok".

sobes.tech AI

პასუხი 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".

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