Senior
Απλή εργασία live coding (βασικός ανταγωνισμός) Όροι: Γράψτε μια συνάρτηση fetchAll(urls []string) map[string]string, που για κάθε URL εκτελεί ανταγωνιστικά ένα HTTP GET αίτημα και επιστρέφει έναν χάρτη όπου το κλειδί είναι το URL και η τιμή το σώμα της απάντησης (string). Αν το αίτημα αποτύχει (σφάλμα, όχι 200), η τιμή θα είναι κενή συμβολοσειρά. Περιορισμοί: - Δεν επιτρέπεται η χρήση εξωτερικών βιβλιοθηκών (μόνο οι standard). - Δεν επιτρέπεται η αλλαγή της υπογραφής. - Το πρόγραμμα δεν πρέπει να πέσει σε περίπτωση πανικού στο 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)) } }