Senior
Πρακτική εργασία: υλοποιήστε τη λειτουργία FastestSearcher, η οποία τρέχει δοκιμές πολλαπλών μηχανών αναζήτησης παράλληλα και επιστρέφει το όνομα του ταχύτερου, τον χρόνο απόκρισης και ένα σφάλμα (εάν τουλάχιστον ένας επιστρέψει σφάλμα).
sobes.tech AI
Απάντηση από 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)
}