Параллельный запрос к списку веб‑адресов

Порядок вывода недетерминирован, а пауза 400 мс не гарантирует завершение HTTP-запросов. Кроме того, ответ http.Get нужно закрывать.

Короткий ответ

Что ответить на собеседовании

Порядок вывода недетерминирован, а пауза 400 мс не гарантирует завершение HTTP-запросов. Кроме того, ответ http.Get нужно закрывать.

Подробный разбор

Ответ с пояснениями

Условие

Пример программы, демонстрирующей одновременную отправку HTTP‑запросов к набору сайтов. Сначала формируется массив ссылок, затем для каждой ссылки запускается отдельная горутина, которая выводит статус начала и завершения запроса. После запуска всех горутин основной поток выводит сообщение, ждёт небольшую паузу и завершается.

Вывод программы может выглядеть так:

package main

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

func main() {
    links := []string{
        "https://www.lamoda.ru",
        "https://www.yandex.ru",
        "https://www.mail.ru",
        "https://www.google.com",
    }

    for _, link := range links {
        go func(l string) {
            fmt.Printf("Fetching %s...\n", l)

            err := getURL(l)
            if err != nil {
                fmt.Printf("Error fetching %s: %v\n", l, err)
                return
            }

            fmt.Printf("Fetched %s\n", l)
        }(link)
    }

    fmt.Println("All requests launched!")
    time.Sleep(400 * time.Millisecond)
    fmt.Println("Program finished.")
}

func getURL(address string) error {
    // Подробная реализация опущена
    _, err := http.Get(address)
    return err
}

Ответ

Порядок вывода недетерминирован, а пауза 400 мс не гарантирует завершение HTTP-запросов. Кроме того, ответ http.Get нужно закрывать.

Сообщение All requests launched означает только запуск горутин: отдельные Fetching могут появиться как до него, так и после. Program finished завершает main, не ожидая остальных запросов.

Вместо Sleep используйте WaitGroup или группу задач. У HTTP-клиента задайте таймаут; после успешного Do/Get вызывайте Body.Close, проверяйте статус и при необходимости читайте тело. Ошибка HTTP 404 сама по себе не становится error у http.Get. Точный набор успешных ответов определяется сетью и серверами, а не только этим кодом.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее