Go開発者は、関数、インターフェース、エラーなどの構文にすぐに慣れます。しかし、「Hello, world」の直後、コードに謎めいたものが現れ始めます。context.Contextです。そして、パッケージの奥のどこかではなく、すべての2番目の関数のシグネチャで直接。なぜそれが必要なのか、なぜそれなしではどこにも行けないのでしょうか?
詳しく見ていきましょう。

Goのコンテキストとは
context.Contextは、呼び出しチェーンを介して渡され、以下を管理する特別なオブジェクトです。
トランザクションの寿命、
プロセスのキャンセル、
締め切り、
メタデータの転送(クエリIDなど)。
コンテキストは、関数が呼び出しとともに受け取り、そこから有用な情報を取得できる「目に見えないバックパック」のようなものです。
コンテキストが最もよく見られる場所
ネットワークリクエストの処理 — 応答が長時間届かない場合は、タイムアウトでキャンセルします。
データベースへのクエリ — 接続を無限に「ぶら下げ」ないようにするため。
背景のゴルチナ — サービス終了時の graceful shutdown。
なぜほぼすべての議論で
Goは次の原則に従います。 明示は暗示よりも良い。グローバル変数や隠れたシグナルの代わりに、関数はコンテキストを直接受け取ります。これにより、コードが予測可能になり、要求が開始される上位レベルで制御が可能になります。
func fetchUser(ctx context.Context, id int) (User, error) {
row := db.QueryRowContext(ctx, "SELECT name FROM users WHERE id=?", id)
...
}タイムアウトで ctx がリクエストされた場合、時間が経過すると内部の操作はすべて自動的に停止します。

重要な作業方法
タイムアウトを使用したコンテキストの作成:
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()手動キャンセル:
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(time.Second)
cancel() // この ctx を聞いているすべての人の作業を停止します
}()値の転送(注意!):
ctx = context.WithValue(ctx, "requestID", "abc123")重要: WithValue を乱用することは避けるべきです。これは本格的なデータではなく、「メタデータ」に近いものです。
よくある間違いや落とし穴
cancel()→ リソースリークを呼び出しませんでした。すべてを
WithValueに押し込む → 読みやすさが失われます。コンテキストをさらに伝えない→機能が自分自身を制御できないようにする。
context の基本的な考え方はシンプルです。 制御は呼び出しコードにあるべきで、呼び出し先コードにあるべきではありませんそのため、Goでは、標準ライブラリパッケージのほぼすべての公開関数が引数から始まります。 ctx。
コンテキストは、Goの単なる流行語ではありません。これは、プログラムを予測可能にし、管理可能にし、フリーズから保護する組み込みツールです。早く正しく使用し始めるほど、将来の「痛み」が少なくなります。
コディックが登場 Goの新しいトップコース 🚀
これは、高速で信頼性の高いサービスを書く言語を習得したい人のための、強力でわかりやすいスタートです。このコースでは、最初のステップから、ゴールーティンやコンテキストのような重要な概念まで、すべてを簡単な言葉で説明します。
そして、私たちは居心地の良い テレグラムチャンネル、ITの世界のニュースを共有し、興味深いタスクを分析し、コミュニティとコミュニケーションを取る場所です。最も重要なものを見逃さないように、サブスクライブしてください。
