Sobes.tech
Senior

// Correggere il codice in modo che le richieste siano concorrenti e venga visualizzato il codice di risposta // e in caso di errore, visualizzare il log e continuare l'elaborazione package main import "net/http" var addrs = []string{"[link] "[link] "[link] "[link] "[link] "[link] "[link] func main() { var wg sync.WaitGroup data := make(map[string]bool) for _, url := range addrs { wg.Add(1) if !data[url] { data[url] = true go func(url string) { defer wg.Done() resp, err := http.Get(url) if err != nil { log.Println(err) return } log.Println(resp.StatusCode) }(url) } } wg.Wait() }

sobes.tech AI

Risposta dell'AI

go package main

import ( "log" "net/http" "sync" )

var addrs = []string{ "https://example.com/1", "https://example.com/2", "https://example.com/3", "https://example.com/4", "https://example.com/5", "https://example.com/6", "https://example.com/7", }

func main() { wg := sync.WaitGroup{} data := make(map[string]bool) mu := sync.Mutex{} // для защиты map

for _, url := range addrs {
    mu.Lock()
    if !data[url] {
        data[url] = true
        mu.Unlock()

        wg.Add(1)
        go func(url string) {
            defer wg.Done()
            resp, err := http.Get(url)
            if err != nil {
                log.Printf("Ошибка при запросе %s: %v", url, err)
                return
            }
            defer resp.Body.Close()
            log.Printf("Ответ от %s: %d", url, resp.StatusCode)
        }(url)
    } else {
        mu.Unlock()
    }
}
wg.Wait()

}


**Объяснение:**
- Добавлен мьютекс `mu` для безопасного доступа к карте `data` из нескольких горутин.
- Проверка и установка значения в `data` происходит под защитой мьютекса, чтобы избежать гонок.
- Запросы выполняются конкурентно в горутинах.
- В случае ошибки выводится лог с ошибкой, но выполнение продолжается.
- Код ответа HTTP выводится в лог.
- Используется `defer resp.Body.Close()` для корректного закрытия тела ответа.