Sobes.tech
Senior

Vienkārša tiešās kodēšanas uzdevums (pamata konkurētspēja) Nosacījums: Uzrakstiet funkciju fetchAll(urls []string) map[string]string, kas katram URL vienlaikus veic HTTP GET pieprasījumu un atgriež karti, kur atslēga ir URL, bet vērtība ir atbildes ķermenis (virkne). Ja pieprasījums neizdodas (kļūda, ne 200), vērtība būs tukša virkne. Ierobežojumi: - Nav atļauts izmantot ārējās bibliotēkas (tikai standarta). - Nav atļauts mainīt parakstu. - Programma nedrīkst krist panikas dēļ http.Get. Ievades piemērs: ["[link]" "[link]" "[link]"]

sobes.tech AI

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