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