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

13. Выгрузка статистики кампании в CSV

Средняя

Go · 38 строк

Рекламодатель выгружает статистику кампании по дням и площадкам: от сотен строк до 2 млн. Обработчик читает реплику пачками по 5 000 строк и сразу пишет их в ответ.

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

В работе: Кнопка «Скачать CSV» в кабинете рекламодателя.

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

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

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. package reports
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "time"
  7. )
  8. type Row struct {
  9. Day string
  10. Shows int64
  11. Clicks int64
  12. }
  13. type Store interface {
  14. Batch(ctx context.Context, campaignID string, offset, limit int) ([]Row, error)
  15. }
  16. // ExportHandler выгружает статистику рекламной кампании в CSV.
  17. func ExportHandler(s Store) http.HandlerFunc {
  18. return func(w http.ResponseWriter, r *http.Request) {
  19. base := context.Background()
  20. ctx, _ := context.WithTimeout(base, 30*time.Second)
  21. campaign := r.URL.Query().Get("campaign")
  22. w.Header().Set("Content-Type", "text/csv")
  23. for offset := 0; ; offset += 5000 {
  24. rows, err := s.Batch(ctx, campaign, offset, 5000)
  25. if err != nil || len(rows) == 0 {
  26. return
  27. }
  28. for _, row := range rows {
  29. fmt.Fprintf(w, "%s,%d,%d\n", row.Day, row.Shows, row.Clicks)
  30. }
  31. time.Sleep(200 * time.Millisecond) // бережём реплику
  32. }
  33. }
  34. }