Go · 56 строк
SendAll отправляет пачку уведомлений через HTTP-провайдера и считает, сколько push ушло каждому клиенту. В обычный день в пачке 5–20 тысяч уведомлений, в день зарплаты — до 2 млн.
Отметьте строки с ошибками. Код собирается Go 1.22.
В работе: Уведомления о списаниях и зачислениях: клиент ждёт push через секунды после операции.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: на задачах Сбера: push-уведомления о платежах. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package pushimport ("bytes""encoding/json""fmt""log""net/http""sync")type Notification struct {ClientID stringPhone stringText string}type Sender struct {client *http.Clienturl stringsent map[string]int}func NewSender(url string) *Sender {return &Sender{client: &http.Client{}, url: url, sent: map[string]int{}}}func (s *Sender) SendAll(batch []Notification) error {var wg sync.WaitGrouperrs := make(chan error)for _, n := range batch {wg.Add(1)go func() {defer wg.Done()body, _ := json.Marshal(n)resp, err := s.client.Post(s.url, "application/json", bytes.NewReader(body))if err != nil {log.Printf("push failed for %s: %v", n.Phone, err)errs <- errreturn}if resp.StatusCode != http.StatusOK {errs <- fmt.Errorf("push status %d", resp.StatusCode)return}resp.Body.Close()s.sent[n.ClientID]++}()}wg.Wait()close(errs)for err := range errs {return err}return nil}