Sobes.tech
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)) } }