Go · 38 строк
Рекламодатель выгружает статистику кампании по дням и площадкам: от сотен строк до 2 млн. Обработчик читает реплику пачками по 5 000 строк и сразу пишет их в ответ.
Отметьте строки с ошибками.
В работе: Кнопка «Скачать CSV» в кабинете рекламодателя.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: на задачах Яндекса: статистика рекламных кампаний. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package reportsimport ("context""fmt""net/http""time")type Row struct {Day stringShows int64Clicks int64}type Store interface {Batch(ctx context.Context, campaignID string, offset, limit int) ([]Row, error)}// ExportHandler выгружает статистику рекламной кампании в CSV.func ExportHandler(s Store) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {base := context.Background()ctx, _ := context.WithTimeout(base, 30*time.Second)campaign := r.URL.Query().Get("campaign")w.Header().Set("Content-Type", "text/csv")for offset := 0; ; offset += 5000 {rows, err := s.Batch(ctx, campaign, offset, 5000)if err != nil || len(rows) == 0 {return}for _, row := range rows {fmt.Fprintf(w, "%s,%d,%d\n", row.Day, row.Shows, row.Clicks)}time.Sleep(200 * time.Millisecond) // бережём реплику}}}