package main import ( "context" "fmt" "time" ) var timerSinceCtxKey = ctxKey("timerSince") func startTimer(d time.Duration) (context.Context, context.CancelFunc) { return context.WithTimeout( context.WithValue(context.Background(), timerSinceCtxKey, time.Now()), d, ) } func getTimerSince(ctx context.Context) time.Duration { return time.Since(ctx.Value(timerSinceCtxKey).(time.Time)) } func checkTimeout(ctx context.Context) { select { case <-ctx.Done(): panic(newError(503, fmt.Sprintf("Timeout after %v", getTimerSince(ctx)), "Timeout")) default: // Go ahead } }