Пакет context — один из самых важных инструментов в Go для управления отменой операций, таймаутами и передачей данных между горутинами. Однако многие разработчики используют его неправильно, что приводит к утечкам памяти или неочевидным багам. В этой статье разберём: context решает три ключевые задачи: func handler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel() // Освобождаем ресурсы
result, err := someLongOperation(ctx)
if err != nil {
http.Error(w, "Operation timed out", http.StatusGatewayTimeout)
return
}
fmt.Fprintf(w, "Result: %v", result)
} Что происходит? МетодОписаниеWithCancelСоздаёт контекст с возможностью отмены (cancel()).WithTimeoutАвтоматическая отмена через заданное время.WithDeadlineОтмена в конкретный момент времени (например, 2025-01-01 00:00:00).WithValueПередача данных (например, userID или requestID). // Плохо: контекст — не место для сложных структур!