Senior
Eenvoudige live coding taak (basis gelijktijdigheid) Voorwaarde: Schrijf een functie fetchAll(urls []string) map[string]string, die voor elke URL gelijktijdig een HTTP GET-verzoek uitvoert en een kaart retourneert waarbij de sleutel de URL is en de waarde de response body (string). Als het verzoek mislukt (fout, niet 200), wordt de waarde een lege string. Beperkingen: - Kan geen externe bibliotheken gebruiken (alleen standaard). - Kan de handtekening niet wijzigen. - Het programma mag niet crashen bij een panic in http.Get. Voorbeeld invoer: ["[link]" "[link]" "[link]"]
sobes.tech AI
Antwoord van 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)) } }