Программа с тремя сопрограммами: генерация и вывод чисел

Один канал с двумя читателями распределит каждое число ровно одному из них. Производитель закрывает канал, main ждёт обоих потребителей.

Короткий ответ

Что ответить на собеседовании

Один канал с двумя читателями распределит каждое число ровно одному из них. Производитель закрывает канал, main ждёт обоих потребителей.

Подробный разбор

Ответ с пояснениями

Условие

Разработать приложение, состоящее из трёх потоков (или сопрограмм). Первый поток отвечает за генерацию последовательности чисел и передаёт их двум остальным потокам. Оставшиеся два потока принимают полученные значения и выводят их на экран. После завершения работы программы на экране должны появиться все сгенерированные числа в произвольном порядке, но без повторений.

Ответ

Один канал с двумя читателями распределит каждое число ровно одному из них. Производитель закрывает канал, main ждёт обоих потребителей.

Три рабочие горутины плюс main для координации:

package main

import (
    "fmt"
    "sync"
)

func main() {
    numbers := make(chan int)
    go func() {
        defer close(numbers)
        for i := 1; i <= 10; i++ { numbers <- i }
    }()
    var wg sync.WaitGroup
    for worker := 0; worker < 2; worker++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for value := range numbers { fmt.Println(value) }
        }()
    }
    wg.Wait()
}

Все числа 1–10 получит один из читателей. Порядок печати произволен; отправка каждого числа в два разных канала дала бы дубликаты. Гарантия относится к обычному выполнению одного процесса, а не восстановлению после сбоя.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее