Fan-In: объединение данных от источников

К задачам
Средняя
Concurrency

Условие задачи

Реализуй fan-in: есть три источника данных — горутины, которые отправляют в канал строки (например, имена или числа в виде строки). Нужно объединить их в один канал и читать из него в основной горутине.

func producer(name string, out chan<- string) {
    // TODO: шли строки с префиксом name
}

func main() {
    out := make(chan string)

    // TODO: запусти 3 горутины producer

    // TODO: выведи первые 10 сообщений из out
}
func producer(name string, out chan<- string) {
    // TODO: шли строки с префиксом name
}

func main() {
    out := make(chan string)

    // TODO: запусти 3 горутины producer

    // TODO: выведи первые 10 сообщений из out
}

Подсказка

Ты можешь использовать отдельный канал внутри каждой producer горутины и потом объединить их с помощью select. Или можешь писать сразу в один канал — но тогда нужен контроль завершения.

Решение

Fan-In объединяет несколько потоков данных в один. Это удобно, когда есть несколько источников и ты хочешь централизованно обрабатывать их вывод.

func producer(name string, out chan<- string) {
    for i := 0; i < 10; i++ {
        out <- fmt.Sprintf("%s-%d", name, i)
    }
}

func main() {
    out := make(chan string)

    go producer("A", out)
    go producer("B", out)
    go producer("C", out)

    for i := 0; i < 30; i++ {
        fmt.Println(<-out)
    }
}
func producer(name string, out chan<- string) {
    for i := 0; i < 10; i++ {
        out <- fmt.Sprintf("%s-%d", name, i)
    }
}

func main() {
    out := make(chan string)

    go producer("A", out)
    go producer("B", out)
    go producer("C", out)

    for i := 0; i < 30; i++ {
        fmt.Println(<-out)
    }
}