Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: context, cancel, http request, goroutine, deadline

Как передать контекст отмены в HTTP-запрос?

Вопрос проверяет понимание механизма отмены HTTP-запросов через контекст в Go, что важно для управления ресурсами и предотвращения утечек.

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

В Go для отмены HTTP-запроса используется контекст с функцией отмены. Создаётся контекст через context.WithCancel или context.WithTimeout, затем передаётся в http.NewRequestWithContext. При вызове cancel() запрос прерывается, освобождая ресурсы. Это предотвращает зависшие соединения и позволяет управлять временем выполнения.

Длинный ответ

Передача контекста отмены в HTTP-запрос

В Go контекст (context.Context) является стандартным механизмом для управления временем жизни операций, включая HTTP-запросы. Он позволяет отменить запрос, установить таймаут или дедлайн, а также передавать метаданные. Это критически важно для создания надёжных и масштабируемых приложений, где нужно избегать зависших соединений и утечек горутин.

Как это работает

Основная идея — создать контекст с возможностью отмены и передать его в запрос. Когда контекст отменяется (например, по таймауту или вручную), HTTP-клиент прерывает запрос и закрывает соединение. Это особенно полезно при работе с внешними API, где ответ может задерживаться.

Пример кода

package main

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

func main() {
    // Создаём контекст с таймаутом 2 секунды
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel() // обязательно вызываем cancel для освобождения ресурсов

    req, err := http.NewRequestWithContext(ctx, "GET", "https://example.com", nil)
    if err != nil {
        panic(err)
    }

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        // Проверяем, была ли отмена по контексту
        if ctx.Err() == context.DeadlineExceeded {
            fmt.Println("Request timed out")
        } else {
            fmt.Println("Error:", err)
        }
        return
    }
    defer resp.Body.Close()
    fmt.Println("Status:", resp.Status)
}

Ключевые моменты

  • Используйте context.WithCancel для ручной отмены или context.WithTimeout/context.WithDeadline для автоматической.
  • Всегда вызывайте функцию отмены (cancel) через defer, чтобы избежать утечек ресурсов.
  • Передавайте контекст в http.NewRequestWithContext, а не в сам клиент.
  • Проверяйте ошибки: если контекст отменён, client.Do вернёт ошибку, связанную с контекстом.

Вывод

Передача контекста отмены в HTTP-запросы — это стандартная практика в Go для управления временем выполнения и предотвращения зависших соединений. Она обязательна в production-приложениях, особенно при работе с внешними сервисами или в микросервисной архитектуре.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Golang

    Golang

Ключевые слова

#context

#cancel

#http request

#goroutine

#deadline

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.