Go · 41 строк
Каждую ночь задача списывает дневную часть абонентской платы: месячная плата делится на число дней в месяце. Если на балансе не хватает, номер блокируется. Абонентов — 10 млн, пополнения идут круглосуточно.
Задачу иногда перезапускают после падения. Отметьте строки с ошибками.
В работе: Биллинг: ночная задача, после которой абоненты утром видят списание в приложении.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: на задачах МТС: биллинг тарифов. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package billingimport ("context""database/sql""log""time")type Subscriber struct {ID int64Phone stringBalance float64MonthFee float64}func DailyCharge(ctx context.Context, db *sql.DB, now time.Time) error {rows, err := db.QueryContext(ctx, "SELECT id, phone, balance, month_fee FROM subscribers WHERE active")if err != nil {return err}defer rows.Close()daysInMonth := 30for rows.Next() {var s Subscriberif err := rows.Scan(&s.ID, &s.Phone, &s.Balance, &s.MonthFee); err != nil {return err}fee := s.MonthFee / float64(daysInMonth)if s.Balance < fee {log.Printf("блокировка %s: баланс %.2f", s.Phone, s.Balance)db.ExecContext(ctx, "UPDATE subscribers SET active = false WHERE id = $1", s.ID)continue}_, err := db.ExecContext(ctx, "UPDATE subscribers SET balance = $1 WHERE id = $2", s.Balance-fee, s.ID)if err != nil {return err}}return nil}