===== context.Context ===== ==== What is it? ==== `context.Context` is a standard way to carry: * deadlines, * cancellation signals, * and request-scoped values across API boundaries and between goroutines. ==== What is it used for? ==== * Cancel work when a request is no longer needed (client disconnected, timeout, shutdown). * Enforce timeouts/deadlines for I/O (HTTP calls, DB queries, RPC). * Pass request-scoped metadata (trace IDs, request IDs) carefully. ==== Core functions ==== * `context.Background()` — root context for main/service. * `context.TODO()` — placeholder when you don’t have a context yet. * `context.WithCancel(parent)` — manual cancellation. * `context.WithTimeout(parent, d)` — cancel after duration. * `context.WithDeadline(parent, t)` — cancel at specific time. * `context.WithValue(parent, key, val)` — attach request-scoped values (use sparingly). ==== Example: timeout for work ==== package main import ( "context" "time" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() _ = ctx // pass ctx into HTTP/DB/RPC calls } ==== Example: cancellation (stop goroutine) ==== package main import ( "context" "time" ) func worker(ctx context.Context) { for { select { case <-ctx.Done(): return default: time.Sleep(10 * time.Millisecond) } } } func main() { ctx, cancel := context.WithCancel(context.Background()) go worker(ctx) time.Sleep(50 * time.Millisecond) cancel() time.Sleep(20 * time.Millisecond) } ==== Notes / pitfalls ==== * Context is NOT for global configuration. * Do NOT store large values in context; keep values small (IDs). * Use typed keys to avoid collisions. * Always call `cancel()` to release resources (timers) for timeout/deadline contexts. ==== Related pages ==== * [[go:concurrency:goroutine|Goroutine]] * [[go:stdlib:http_client_struct|http.Client]] * [[go:stdlib:http_server_struct|http.Server]] ==== Hard words (English) ==== * **deadline** /ˈdedlaɪn/: hạn chót * **cancellation** /ˌkænsəˈleɪʃən/: huỷ * **signal** /ˈsɪɡnəl/: tín hiệu * **request-scoped** /rɪˈkwest skoʊpt/: gắn với 1 request * **metadata** /ˈmetəˌdeɪtə/: dữ liệu mô tả * **API boundary** /ˌeɪ piː ˈaɪ ˈbaʊndri/: ranh giới API * **collision** /kəˈlɪʒən/: xung đột * **sparingly** /ˈsperɪŋli/: dùng hạn chế