Fan-In: объединение данных от источников
Условие задачи
Реализуй 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)
}
}