Senior
Vienkārša tiešās kodēšanas uzdevums (pamata konkurētspēja) Nosacījums: Uzrakstiet funkciju fetchAll(urls []string) map[string]string, kas katram URL vienlaikus veic HTTP GET pieprasījumu un atgriež karti, kur atslēga ir URL, bet vērtība ir atbildes ķermenis (virkne). Ja pieprasījums neizdodas (kļūda, ne 200), vērtība būs tukša virkne. Ierobežojumi: - Nav atļauts izmantot ārējās bibliotēkas (tikai standarta). - Nav atļauts mainīt parakstu. - Programma nedrīkst krist panikas dēļ http.Get. Ievades piemērs: ["[link]" "[link]" "[link]"]
sobes.tech AI
Atbilde no AI
go package main
import ( "fmt" "io/ioutil" "net/http" "sync" )
func fetchAll(urls []string) map[string]string { results := make(map[string]string) var mu sync.Mutex var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go func(u string) {
defer wg.Done()
// Обработка паники в http.Get
defer func() {
if r := recover(); r != nil {
mu.Lock()
results[u] = ""
mu.Unlock()
}
}()
resp, err := http.Get(u)
if err != nil {
mu.Lock()
results[u] = ""
mu.Unlock()
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
mu.Lock()
results[u] = ""
mu.Unlock()
return
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
mu.Lock()
results[u] = ""
mu.Unlock()
return
}
mu.Lock()
results[u] = string(body)
mu.Unlock()
}(url)
}
wg.Wait()
return results
}
func main() { urls := []string{ "https://example.com", "https://golang.org", "https://invalid.url", } results := fetchAll(urls) for url, body := range results { fmt.Printf("URL: %s, Body length: %d\n", url, len(body)) } }