Context: назначение и паттерны использования

К вопросам
Средний
Standard Library

Вопрос

Для чего используется context.Context в Go? Какие паттерны его использования вы знаете? Как правильно передавать контекст в функции?

Ответ

Context используется для: - Отмены операций (cancellation) - Передачи дедлайнов и таймаутов - Передачи значений между функциями в цепочке вызовов Основные типы: - context.Background() - корневой контекст - context.WithCancel() - для отмены - context.WithTimeout()/WithDeadline() - с таймаутом - context.WithValue() - для передачи значений

func doWork(ctx context.Context) error {
    select {
    case <-time.After(5 * time.Second):
        return nil // работа завершена
    case <-ctx.Done():
        return ctx.Err() // отменено
    }
}

func main() {
    ctx, cancel := context.WithTimeout(
        context.Background(), 
        2*time.Second,
    )
    defer cancel()
    
    if err := doWork(ctx); err != nil {
        fmt.Printf("Ошибка: %v
", err)
    }
}
func doWork(ctx context.Context) error {
    select {
    case <-time.After(5 * time.Second):
        return nil // работа завершена
    case <-ctx.Done():
        return ctx.Err() // отменено
    }
}

func main() {
    ctx, cancel := context.WithTimeout(
        context.Background(), 
        2*time.Second,
    )
    defer cancel()
    
    if err := doWork(ctx); err != nil {
        fmt.Printf("Ошибка: %v
", err)
    }
}

Дополнительные вопросы

Когда использовать context.WithValue()? Какие есть альтернативы?