Sobes.tech
Senior

საშუალო პირდაპირი კოდირების დავალება (ძირითადი კონკურენცია) შედეგი: დაწერეთ ფუნქცია fetchAll(urls []string) map[string]string, რომელიც თითოეულ URL-ისთვის ერთდროულად ახორციელებს HTTP GET მოთხოვნას და აბრუნებს რუკას, სადაც გასაღებია URL და მნიშვნელობა პასუხის სხეული (სტრინგი). თუ მოთხოვნა ვერ შესრულდა (შეცდომა, არა 200), მნიშვნელობა იქნება ცარიელი სტრინგი. შეზღუდვები: - არ შეიძლება გამოიყენოთ გარე ბიბლიოთეკები (მხოლოდ სტანდარტული). - არ შეიძლება შეცვალოთ ხელმოწერა. - პროგრამა არ უნდა ჩავარდეს http.Get-ის პანიკის დროს. შესავალი მაგალითი: ["[link]" "[link]" "[link]"]

sobes.tech AI

პასუხი 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)) } }