0Pricing
Go Academy · Урок

Зачем нужен context.Context

Отмена и управление жизненным циклом запроса

«Зачем нужен context.Context» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Проблема

Без механизма отмены выполняемой работы медленный запрос к базе данных или HTTP-вызов блокирует свою горутину до завершения, расходуя ресурсы, даже если исходный запрос уже был прерван.

Обзор context.Context

context.Context — это интерфейс, который передаёт сигнал отмены, необязательный крайний срок и метаданные в виде пар «ключ — значение» через границы API и между горутинами.

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key any) any
}

Канал Done

ctx.Done() возвращает канал, который закрывается при отмене контекста или по истечении тайм-аута. Горутины используют его в select, чтобы обнаружить отмену.

select {
case result := <-workCh:
    return result, nil
case <-ctx.Done():
    return nil, ctx.Err()
}

context.Background()

context.Background() — корневой контекст: он никогда не отменяется, не имеет крайнего срока и не содержит значений. Используйте его в начале обработки запроса, в main или в тестах.

context.TODO()

context.TODO() — это также неотменяемый корневой контекст, используемый как заполнитель, когда подходящий контекст ещё недоступен. Он сообщает проверяющим код о намерении разработчика.

Почему Context передаётся первым аргументом

По соглашению первым параметром любой функции, которую можно отменить, является ctx context.Context. Это делает отмену явной и заметной в API.

func FetchUser(ctx context.Context, id int) (*User, error) {
    return db.QueryContext(ctx, "SELECT ...", id)
}

Отмена распространяется

Отмена родительского контекста отменяет все производные дочерние контексты. Это позволяет одним вызовом отмены остановить целое дерево горутин и операций.

Чем Context не является

Context — не универсальное хранилище значений: используйте его только для данных, связанных с областью действия запроса, например идентификаторов трассировки или токенов аутентификации, но не для необязательных параметров. Храните значения в типизированных структурах.

Интеграция со стандартной библиотекой

HTTP-клиент стандартной библиотеки, драйвер SQL, gRPC и многие сторонние пакеты принимают Context, благодаря чему отмена распространяется через весь стек вызовов.

Хранение Context в структуре

Не храните Context внутри структуры. Передавайте его явно как аргумент функции. При хранении время действия отмены становится неочевидным, что часто приводит к ошибкам.

Context неизменяем

Context неизменяем: новые контексты создаются оборачиванием с помощью WithCancel, WithDeadline, WithTimeout или WithValue. Родительский контекст не изменяется.

Быстрая проверка

Что возвращает ctx.Done()?

Повторение: context.Context

Основные моменты:

  • Передаёт отмену, крайний срок и метаданные между горутинами
  • Передавайте первым аргументом; никогда не храните в структурах
  • Канал ctx.Done() закрывается при отмене или по истечении тайм-аута
  • Отмена распространяется от родительского контекста ко всем дочерним

Часто задаваемые вопросы

Урок «Зачем нужен context.Context» бесплатный?

Да — полный текст урока «Зачем нужен context.Context» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Зачем нужен context.Context»?

Отмена и управление жизненным циклом запроса Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Зачем нужен context.Context»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужен context.Context
  2. WithCancel и WithTimeout
  3. WithDeadline и WithValue
  4. Контекст в HTTP- и вызовах к базе данных
← Назад к Go Academy