Go · 34 строк
Рассылка уходит на 2 млн абонентов. SMS-шлюз держит не больше 20 параллельных запросов и при перегрузке отвечает ошибкой. Broadcast возвращает число отправленных SMS для отчёта.
Отметьте строки с ошибками.
В работе: Сервис массовых SMS-рассылок для абонентов.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: на задачах МТС: SMS-рассылки абонентам. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package smsimport ("context""log""sync")type Gateway interface {Send(ctx context.Context, phone, text string) error}// Broadcast рассылает SMS, к шлюзу не больше 20 параллельных запросов.func Broadcast(ctx context.Context, gw Gateway, phones []string, text string) int {sem := make(chan struct{}, 20)var wg sync.WaitGroupsent := 0for _, phone := range phones {wg.Add(1)go func() {defer wg.Done()sem <- struct{}{}if err := gw.Send(ctx, phone, text); err != nil {log.Printf("sms %s: %v", phone, err)return}<-semsent++}()}wg.Wait()return sent}