> For the complete documentation index, see [llms.txt](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/golang-zadachi/http-zaprosy.md).

# HTTP-запросы

### Напиши на Go программу, которая будет выводить коды ответов на HTTP-запросы по двум URL-адресам (например, главная страница Google и главная страница Avito). Запросы должны осуществляться параллельно.&#x20;

Вот пример программы на Go, которая выводит коды ответов на HTTP-запросы по двум URL-адресам, выполняя запросы параллельно:

```go
package main

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

func main() {
    // Определяем URL-адреса для запросов
    urls := []string{
        "https://www.google.com",
        "https://www.avito.ru",
    }

    // Создаем канал для отправки результатов
    results := make(chan int, len(urls))

    // Создаем группу для ожидания завершения всех горутин
    var wg sync.WaitGroup

    // Запускаем горутины для выполнения запросов
    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            defer wg.Done()
            resp, err := http.Get(url)
            if err != nil {
                results <- 0
                return
            }
            results <- resp.StatusCode
        }(url)
    }

    // Ждем завершения всех горутин
    wg.Wait()
    close(results)

    // Выводим результаты
    for statusCode := range results {
        fmt.Println("Код ответа:", statusCode)
    }
}
```

Давайте разберем этот код:

### Объяснение кода

1. Мы определяем два URL-адреса, по которым будем делать запросы: `https://www.google.com` и `https://www.avito.ru`.
2. Создаем канал `results` для отправки результатов запросов. Размер канала равен количеству URL-адресов, чтобы избежать блокировки горутин, ожидающих отправки результатов.
3. Создаем группу `sync.WaitGroup` для ожидания завершения всех горутин.
4. Запускаем горутины для выполнения HTTP-запросов по каждому URL-адресу. Внутри каждой горутины:
   * Отправляем HTTP-запрос с помощью `http.Get(url)`.
   * Если возникает ошибка, отправляем код ответа 0 в канал `results`.
   * Если запрос успешен, отправляем код ответа в канал `results`.
   * Уменьшаем счетчик в группе `sync.WaitGroup` с помощью `wg.Done()`.
5. Ждем завершения всех горутин с помощью `wg.Wait()`.
6. Закрываем канал `results`.
7. Выводим коды ответов, полученные из канала `results`.

Таким образом, программа выполняет HTTP-запросы по двум URL-адресам параллельно, используя горутины, и выводит коды ответов на эти запросы.
