Назад к вопросам
Middle
116
questionbank

Какие известные виды контекстов существуют в Go?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Go стандартный пакет context предоставляет несколько функций для создания контекстов:

  • context.Background(): Возвращает непустой контекст, который обычно используется в качестве корневого контекста для начала выполнения программы. Он никогда не отменяется, не имеет крайнего срока и не несет никаких значений.

  • context.TODO(): Возвращает непустой контекст. Используется, когда вы точно не знаете, какой контекст использовать, или когда функция еще не обновлена для приема контекста. Подобно Background(), он никогда не отменяется, не имеет крайнего срока и не несет значений. Это временный заполнитель.

  • context.WithCancel(parent Context): Возвращает производный контекст, который может быть отменен с помощью возвращаемой функции cancel. Отмена этого контекста освобождает ресурсы, связанные с ним и его дочерними элементами.

    // Создание контекста с отменой
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel() // Отмена контекста при выходе из функции
    
    // Использование ctx...
    
  • context.WithDeadline(parent Context, deadline time.Time): Возвращает производный контекст, который будет отменен автоматически в указанное время deadline. Также возвращает функцию cancel, которая может быть вызвана раньше для отмены.

    // Создание контекста с крайним сроком
    deadline := time.Now().Add(5 * time.Second)
    ctx, cancel := context.WithDeadline(context.Background(), deadline)
    defer cancel()
    
    // Использование ctx...
    
  • context.WithTimeout(parent Context, timeout time.Duration): Подобно WithDeadline, но принимает продолжительность времени. Возвращает производный контекст, который будет отменен автоматически по истечении указанного timeout.

    // Создание контекста с таймаутом
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel()
    
    // Использование ctx...
    
  • context.WithValue(parent Context, key, val any): Возвращает производный контекст, который несет указанную пару ключ/значение. Используется для передачи данных, специфичных для запроса, через API.

    // Создание контекста с значением
    type userIDKey string
    ctx := context.WithValue(context.Background(), userIDKey("user_id"), 123)
    
    // Получение значения из контекста
    if userID, ok := ctx.Value(userIDKey("user_id")).(int); ok {
        // использовать userID
    }
    

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