Выполнить все задачи в горутинах | Вопросы для собеседования | Skilio
/s/public
Golang Средний Опубликовано
Выполнить все задачи в горутинах
Вопрос:

Есть массив задач с методом Run() error Реализовать функцию func execute(tasks []Task) []error, которая запускает каждую задачу в своей горутине и возвращает массив ошибок

func execute(tasks []Task) []error
type Task interface {
  Run() error

}
Ответ:
 func execute(tasks []Task) []error {
  group := &sync.WaitGroup{}
  group.Add(len(tasks))
  errChan := make(chan error, len(tasks))
  for _, task := range tasks {
    go func(task Task) {
      defer group.Done()
      if err := task.Run(); err != nil {
        errChan <- err
      }
    }(task)
  }

  group.Wait()
  close(errChan)
  var res []error
  for err := range errChan {
    res = append(res, err)
  }
  return res
}

Ошибки:

  • Забыл передать задачу в горутину, как параметер
  • Забыл подождать выполнение
  • Забыл закрыть канал
  • Не смог получить массив ошибок

Ожидается, что кандидат умеет работать с горутинами, WaitGroup, каналами, знает как ведет себя range по каналу после его закрытия

Решение без WaitGroup

func execute(tasks []Task) []error {
    errCh := make(chan error, len(tasks))

    for _, t := range tasks {
        go func(t Task){
            errCh <- t.Run()
        }(t)
    }

    res := make([]error, 0, len(tasks))

    for i := 0; i < len(tasks); i++ {
        if err := <-errCh; err != nil {
            res = append(res, err)
        }
    }
    return res

}
0
© Skilio, 2025
Условия использования
Политика конфиденциальности
Мы используем файлы cookie, для персонализации сервисов и повышения удобства пользования сайтом. Если вы не согласны на их использование, поменяйте настройки браузера.