Sobes.tech
Senior

Tâche simple de codage en direct (concurrence de base) Condition: Écris une fonction fetchAll(urls []string) map[string]string, qui pour chaque URL effectue une requête HTTP GET de manière concurrente et retourne une carte où la clé est l'URL et la valeur est le corps de la réponse (chaîne). Si la requête échoue (erreur, pas 200), la valeur sera une chaîne vide. Restrictions: - Impossible d'utiliser des bibliothèques externes (seules les standard). - Impossible de changer la signature. - Le programme ne doit pas planter en cas de panic dans http.Get. Exemple d'entrée: ["[link]" "[link]" "[link]"]

sobes.tech IA

Réponse de l'IA

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)) } }