Context — a Go standard library package (context.Context) that carries deadlines, cancellation signals, and request-scoped values across API boundaries and goroutines.
Context creation functions:
1// Root contexts2ctx := context.Background() // for main/init/tests3ctx := context.TODO() // when unsure45// Derived contexts6ctx, cancel := context.WithCancel(parent) // manual cancel7ctx, cancel := context.WithTimeout(parent, 5s) // timeout8ctx, cancel := context.WithDeadline(parent, t) // deadline9ctx = context.WithValue(parent, key, val) // add value
Practical patterns:
1// HTTP handler with context propagation2func handler(w http.ResponseWriter, r *http.Request) {3 ctx := r.Context()45 // Add custom value6 ctx = context.WithValue(ctx, "request_id", uuid.New())78 // Call service with timeout9 svcCtx, cancel := context.WithTimeout(ctx, 3*time.Second)10 defer cancel()1112 result, err := myService.DoWork(svcCtx)13 if err != nil {14 if errors.Is(err, context.DeadlineExceeded) {15 http.Error(w, "timeout", http.StatusGatewayTimeout)16 } else if errors.Is(err, context.Canceled) {17 // Client disconnected, don't write response18 } else {19 http.Error(w, "error", http.StatusInternalServerError)20 }21 return22 }2324 json.NewEncoder(w).Encode(result)25}
Context hierarchy:
When to use context:
Common mistakes:
cancel() (resource leak).context.Background() in library code.defer cancel().