Войти Регистрация
Конкурентность

12. Слияние событий складов в один канал

Лёгкая

Go · 41 строк

Аналитика получает события сборки заказов с трёх складов и сливает их в один поток через merge.

Отметьте строки с ошибками и ответьте, чем закончится запуск.

В работе: Поток событий складов для дашборда сборки заказов.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
каналызакрытие каналаfan-inpanic

Источник: на данных Ozon: склады и заказы. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. package main
  2. import "fmt"
  3. type Event struct {
  4. Warehouse string
  5. OrderID int64
  6. }
  7. func feed(name string, n int) <-chan Event {
  8. ch := make(chan Event)
  9. go func() {
  10. defer close(ch)
  11. for i := 1; i <= n; i++ {
  12. ch <- Event{Warehouse: name, OrderID: int64(i)}
  13. }
  14. }()
  15. return ch
  16. }
  17. // merge сливает события складов в один поток для аналитики.
  18. func merge(sources ...<-chan Event) <-chan Event {
  19. out := make(chan Event)
  20. for _, src := range sources {
  21. go func() {
  22. defer close(out)
  23. for e := range src {
  24. out <- e
  25. }
  26. }()
  27. }
  28. return out
  29. }
  30. func main() {
  31. events := merge(feed("Хоругвино", 3), feed("Пушкино", 2), feed("Казань", 4))
  32. for {
  33. e := <-events
  34. fmt.Println(e.Warehouse, e.OrderID)
  35. }
  36. }