Senior
Einfache Live-Coding-Aufgabe (grundlegende Konkurrenz) Bedingung: Schreibe eine Funktion fetchAll(urls []string) map[string]string, die für jede URL eine HTTP GET-Anfrage konkurrierend durchführt und eine Karte zurückgibt, bei der der Schlüssel die URL ist und der Wert der Antwortkörper (String). Wenn die Anfrage fehlschlägt (Fehler, kein 200), ist der Wert ein leerer String. Einschränkungen: - Keine externen Bibliotheken verwenden (nur Standard). - Die Signatur darf nicht geändert werden. - Das Programm darf bei einem Panic in http.Get nicht abstürzen. Beispiel Eingabe: ["[link]" "[link]" "[link]"]
sobes.tech KI
Antwort von 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)) } }