Context Package: Cancellation, Timeouts & Deadlines | Go Tutorial #28
Video: Context Package: Cancellation, Timeouts & Deadlines | Go Tutorial #28 by Taught by Celeste AI - AI Coding Coach
Take the quiz on the full lesson page
Test what you've read · interactive walkthrough
Context Package: Cancellation, Timeouts & Deadlines in Go
The Go context package provides powerful tools for managing cancellation signals, timeouts, deadlines, and request-scoped data in concurrent programs. It is essential for writing robust networked applications, allowing you to propagate cancellation signals and pass contextual information safely across API boundaries.
Code
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Create a root context, usually context.Background() or context.TODO()
ctx := context.Background()
// Create a cancellable context derived from the root context
ctx, cancel := context.WithCancel(ctx)
// Start a goroutine that listens for cancellation
go func(ctx context.Context) {
select {
case <-ctx.Done():
fmt.Println("Goroutine: context cancelled:", ctx.Err())
return
}
}(ctx)
// Simulate some work
time.Sleep(1 * time.Second)
// Cancel the context manually
cancel()
// Wait a bit to observe cancellation effect
time.Sleep(500 * time.Millisecond)
// Example of timeout context
ctxTimeout, cancelTimeout := context.WithTimeout(context.Background(), 2*time.Second)
defer cancelTimeout()
select {
case <-time.After(3 * time.Second):
fmt.Println("Operation completed")
case <-ctxTimeout.Done():
fmt.Println("Timeout reached:", ctxTimeout.Err())
}
// Using context.WithValue to pass request-scoped data
type key string
ctxWithValue := context.WithValue(context.Background(), key("userID"), 42)
userID := ctxWithValue.Value(key("userID"))
fmt.Println("User ID from context:", userID)
}
Key Points
context.Background()andcontext.TODO()provide root contexts for deriving others.context.WithCancel()creates a context that can be cancelled manually, propagating cancellation to child contexts.context.WithTimeout()andcontext.WithDeadline()automatically cancel the context after a set duration or deadline.context.WithValue()safely passes request-scoped data using typed keys to avoid collisions.- Passing context explicitly in function parameters is a best practice to manage cancellation and deadlines consistently.
Ready? Take the quiz on the full lesson page →
Test what you've learned. Watch the lesson and try the interactive quiz on the same page.