Проходим собеседование на GoLang - разработчика
  • Введение
  • Общие вопросы
  • ✏️Шпаргалка по синтаксису GoLang
  • 📖GoLang теория
    • Типы данных
    • Строки
    • Массивы и слайсы
    • Мапы
    • Каналы
    • Goрутины
    • Гонка данных
    • Мьютексы
    • Контекст
    • ООП, интерфейсы
    • Другие вопросы по Go
  • 🚲GoLang Задачи
    • Задачи на строки
    • Задачи на слайсы
    • Задачи на мапы
    • Задачи на указатель
    • HTTP-запросы
    • Задачи про каналы
    • Задачи на интерфесы
    • Задачи на горутины
    • Задачи с БД
    • Задачи на defer
    • Задачи на таймер
    • Задачи на рефакторинг
    • Нерассортированные задачи
  • 🏬Базы данных
    • 🥥SQL (язык запросов)
    • 🍩Индексы
    • 🥞Транзакции
    • ✈️Масштабирование
  • 🚆Протоколы HTTP/UDP/TCP и т.д.
  • 🛞Алгоритмы
  • 🖥️Операционные системы
  • 🚢Сисдиз
  • 🤪Управление командой
Powered by GitBook
On this page
  • Напиши на Go программу, которая будет выводить коды ответов на HTTP-запросы по двум URL-адресам (например, главная страница Google и главная страница Avito). Запросы должны осуществляться параллельно.
  • Объяснение кода
  1. GoLang Задачи

HTTP-запросы

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

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

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-адресам параллельно, используя горутины, и выводит коды ответов на эти запросы.

PreviousЗадачи на указательNextЗадачи про каналы

Last updated 1 year ago

🚲