Working with Context

1. Creating Context with Timeout

Example: Timeout context

ctx, cancel := context.WithTimeout(parent, 2*time.Second)
defer cancel()
FunctionUse
WithTimeoutRelative duration
WithDeadlineAbsolute time
WithCancelManual cancel

2. Creating Context with Deadline

Example: Deadline

ctx, cancel := context.WithDeadline(parent, time.Now().Add(5*time.Second))
defer cancel()
UseDetail
Pipeline budgetOne deadline shared across many calls
Wall-clock capBound total operation

3. Creating Context with Cancellation

PatternDetail
WithCancelManual control
WithCancelCause(err) Go 1.20+Attach reason
context.Cause(ctx)Retrieve cancellation cause

4. Propagating Context

RuleDetail
Always pass ctxFirst argument of every function
Never store ctx in structsPer-request only
Forward to clientsAuto-propagates deadlines, metadata, cancellation

5. Checking Context Cancellation

Example: Cooperative check

select {
case <-ctx.Done():
    return ctx.Err()
default:
}

6. Getting Context Error

ErrorCause
context.CanceledCancel called
context.DeadlineExceededTimeout reached

7. Adding Context Values

Example: Typed key

type userIDKey struct{}
ctx = context.WithValue(ctx, userIDKey{}, "u123")
id, _ := ctx.Value(userIDKey{}).(string)
RuleDetail
Use unexported key typeAvoid collisions
Only request-scoped dataNot for config, logger, etc.

8. Using Background Context

ContextUse
context.Background()Root of long-running processes
context.TODO()Placeholder during refactor

9. Setting Default Timeout

Example: Interceptor sets default deadline

func WithDefault(timeout time.Duration) grpc.UnaryClientInterceptor {
    return func(ctx context.Context, method string, req, reply any,
        cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
        if _, ok := ctx.Deadline(); !ok {
            var cancel context.CancelFunc
            ctx, cancel = context.WithTimeout(ctx, timeout)
            defer cancel()
        }
        return invoker(ctx, method, req, reply, cc, opts...)
    }
}

10. Handling Context Timeout Errors

SideSees
Clientcodes.DeadlineExceeded
Server handlerctx.Err() == context.DeadlineExceeded
Downstream callInherits remaining time minus network