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

7. Отправка push о списаниях: select с default

Лёгкая

Go · 39 строк

Consumer получает события о списаниях по карте и шлёт клиенту push. Run работает в отдельной горутине, Stop вызывается при graceful shutdown пода.

Отметьте строки с ошибками.

В работе: Сервис уведомлений о списаниях по карте.

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

Источник: на задачах Т‑Банка: уведомления о списаниях. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. package notify
  2. import "log"
  3. type Event struct {
  4. ClientID string
  5. Text string
  6. }
  7. // Consumer отправляет push о списаниях по карте.
  8. type Consumer struct {
  9. events chan Event
  10. stopped bool
  11. }
  12. func NewConsumer() *Consumer {
  13. return &Consumer{events: make(chan Event, 1000)}
  14. }
  15. func (c *Consumer) Run(send func(Event) error) {
  16. for !c.stopped {
  17. select {
  18. case e := <-c.events:
  19. if err := send(e); err != nil {
  20. log.Printf("push %s: %v", e.ClientID, err)
  21. }
  22. default:
  23. }
  24. }
  25. }
  26. func (c *Consumer) Publish(e Event) {
  27. c.events <- e
  28. }
  29. // Stop вызывается из горутины graceful shutdown.
  30. func (c *Consumer) Stop() {
  31. c.stopped = true
  32. }