Sobes.tech
Back to questions
Senior
8

// Исправить код так, чтобы запросы были конкурентными и выводился код ответа // и в случае ошибки - выводили ее лог и продолжали обработку package main import "net/http" var addrs = []string{"[link] "[link] "[link] "[link] "[link] "[link] "[link] func main() { 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.err return } log.info }(url) } } wg.Wait() }

Companies where asked
ИП Ганус Александр Андреевич

Answer from AI

sobes.tech 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()` для корректного закрытия тела ответа.