Context — a Go standard library type (context.Context) that carries deadlines, cancellation signals, and request-scoped values across goroutine boundaries.
Core operations:
1// Create contexts2ctx := context.Background() // root context3ctx, cancel := context.WithCancel(parent) // manual cancel4ctx, cancel := context.WithTimeout(parent, 5s) // timeout5ctx, cancel := context.WithDeadline(parent, t) // deadline6ctx = context.WithValue(parent, "key", "val") // add value78// Always call cancel!9defer cancel()
Checking context state:
1select {2case <-ctx.Done():3 // Context cancelled or deadline exceeded4 err := ctx.Err()5 if errors.Is(err, context.Canceled) {6 // Manual cancellation7 } else if errors.Is(err, context.DeadlineExceeded) {8 // Timeout/deadline9 }10case result := <-ch:11 // Normal operation12}
Context values:
1// Use custom key types to avoid collisions2type contextKey struct{}34func WithRequestID(ctx context.Context, id string) context.Context {5 return context.WithValue(ctx, contextKey{}, id)6}78func GetRequestID(ctx context.Context) string {9 if id, ok := ctx.Value(contextKey{}).(string); ok {10 return id11 }12 return ""13}
When to use context:
Common mistakes:
cancel() (resource leak).context.Background() in library code.defer cancel().