Назад к вопросам
Senior
2
Практическая задача: реализовать функцию FastestSearcher, которая запускает тестирование нескольких поисковиков параллельно и возвращает имя самого быстрого, время ответа и ошибку (если хотя бы один вернул ошибку — вернуть ошибку).
Компании, где спрашивали
Магнит Тех
Ответ от нейросети
sobes.tech AI
go package main
import ( "errors" "fmt" "sync" "time" )
type SearchResult struct { Name string Duration time.Duration Err error }
// FastestSearcher запускает параллельно несколько функций поиска и возвращает имя самого быстрого, время и ошибку. func FastestSearcher(searchers map[string]func() error) (string, time.Duration, error) { results := make(chan SearchResult, len(searchers)) var wg sync.WaitGroup
for name, searchFunc := range searchers {
wg.Add(1)
go func(n string, f func() error) {
defer wg.Done()
start := time.Now()
err := f()
dur := time.Since(start)
results <- SearchResult{Name: n, Duration: dur, Err: err}
}(name, searchFunc)
}
wg.Wait()
close(results)
var fastest SearchResult
var hasError bool
first := true
for res := range results {
if res.Err != nil {
hasError = true
}
if first || res.Duration < fastest.Duration {
fastest = res
first = false
}
}
if hasError {
return fastest.Name, fastest.Duration, errors.New("at least one searcher returned an error")
}
return fastest.Name, fastest.Duration, nil
}
func main() { searchers := map[string]func() error{ "Google": func() error { time.Sleep(100 * time.Millisecond) return nil }, "Bing": func() error { time.Sleep(80 * time.Millisecond) return nil }, "Yahoo": func() error { time.Sleep(120 * time.Millisecond) return errors.New("timeout") }, }
name, duration, err := FastestSearcher(searchers)
fmt.Printf("Fastest: %s, Duration: %v, Error: %v\n", name, duration, err)
}