Разработчику было дано задание написать сервис отправки уведомлений.

go package main

Короткий ответ

Что ответить на собеседовании

go package main

Подробный разбор

Ответ с пояснениями

Условие

/ * Разработчику было дано задание написать сервис отправки уведомлений. Требования:

  • Метод Send должен отправлять сообщения параллельно.
  • Одновременно может выполняться не более maxworkers HTTP-запросов.
  • Если хотя бы одна отправка завершилась ошибкой - нужно остановить остальные отправки и вернуть ошибку.
  • Метод должен корректно обрабатывать отмену контекста.
  • Все ресурсы должны корректно освобождаться.
  • Метод может вызываться конкурентно из разных goroutine.
  • Client должен хранить количество успешно отправленных сообщений.

нужно сделать code review, найти проблемы и исправить код.

Ответ

go package main

import ( "context" "fmt" "sync" "time" )

// Task представляет задачу для обработки type Task struct { id int // другие поля }

// WorkerPool реализует пул воркеров func WorkerPool(ctx context.Context, tasks <-chan Task, results chan<- string, wg *sync.WaitGroup) { defer wg.Done() for { select { case <-ctx.Done(): return case task, ok := <-tasks: if !ok { return } // Обработка задачи res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }

func processTask(t Task) string { // имитация работы time.Sleep(100 * time.Millisecond) return fmt.Sprintf("result for task %d", t.id) }

func main() { tasks := make(chan Task) results := make(chan string) var wg sync.WaitGroup

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

workerCount := 5
wg.Add(workerCount)
for i := 0; i < workerCount; i++ {
	go WorkerPool(ctx, tasks, results, &wg)
}

// Отдельный горутин для закрытия канала результатов после завершения воркеров
go func() {
	wg.Wait()
	close(results)
}()

// Отправляем задачи
go func() {
	for i := 0; i < 20; i++ {
		tasks <- Task{id: i}
	}
	close(tasks)
}()

// Сбор результатов
for res := range results {
	fmt.Println(res)
}

}

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку