Выполнить все задачи в горутинах
Вопрос:
Есть массив задач с методом 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