Конвейер обработки чисел в горутинах с мгновенным выводом

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

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

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

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

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

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

Условие

В задаче задействованы две горутины и два канала. Первый канал (sourceChan) получает поток чисел. Вторая горутина читает данные из sourceChan (например, умножает каждое число на 2) и отправляет полученные результаты во второй канал (resultChan). Главная горутина (main) должна выводить значения из resultChan по мере их появления и после завершения обработки вывести агрегированный итог (например, сумму всех полученных чисел).

Ответ

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

Здесь две рабочие горутины плюс main. Каналы закрываются только отправляющей стороной.

package main

import "fmt"

func main() {
    sourceChan := make(chan int)
    resultChan := make(chan int)
    go func() {
        defer close(sourceChan)
        for _, n := range []int{1, 2, 3} {
            sourceChan <- n
        }
    }()
    go func() {
        defer close(resultChan)
        for n := range sourceChan {
            resultChan <- n * 2
        }
    }()
    sum := 0
    for n := range resultChan {
        fmt.Println(n)
        sum += n
    }
    fmt.Println("sum:", sum)
}

Результат: 2, 4, 6 и сумма 12. Для бесконечного источника или досрочного выхода main во все блокирующие отправки и чтения добавляют отмену, иначе upstream может зависнуть.

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

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

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

Подробнее