Sobes.tech
Back to questions
Middle
6

Что такое контекст (context) в Go? Как используется? Как работает отмена через контекст?

Companies where asked
YadroYadro

Answer from AI

sobes.tech AI

В Go context — это пакет, который используется для передачи сигналов отмены, дедлайнов и других значений между горутинами, особенно при работе с запросами и внешними операциями.

Основные возможности context:

  • Отмена: позволяет отменить операцию, если она больше не нужна или превысила время ожидания.
  • Дедлайн: задаёт время, после которого операция автоматически отменяется.
  • Передача значений: можно передавать данные, например, идентификаторы запросов.

Как используется:

Создаётся базовый контекст, обычно context.Background() или context.TODO(). Затем создаются производные контексты с таймаутом, дедлайном или возможностью отмены.

Пример с отменой:

import (
    "context"
    "fmt"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    go func() {
        time.Sleep(2 * time.Second)
        cancel() // Отмена контекста через 2 секунды
    }()

    select {
    case <-time.After(5 * time.Second):
        fmt.Println("Операция завершена")
    case <-ctx.Done():
        fmt.Println("Операция отменена:", ctx.Err())
    }
}

Как работает отмена через контекст:

  • При вызове функции cancel() или при достижении дедлайна, канал ctx.Done() закрывается.
  • Все горутины, которые слушают этот канал, получают сигнал об отмене и могут корректно завершить работу.

Таким образом, context помогает управлять временем жизни операций и координировать отмену между горутинами.