Sobes.tech
Senior

Pratik görev: FastestSearcher fonksiyonunu uygulayın, bu fonksiyon birkaç arama motorunu paralel olarak test eder ve en hızlı olanın adını, yanıt süresini ve hatayı döner (eğer en az biri hata dönerse).

sobes.tech yapay zeka

AI'dan gelen yanıt

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)

}