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