Производитель закрывает 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 может зависнуть.