{}const=>[]async()letfn</>var
開発

痛みのないGoコンテキスト—context.Contextを理解する方法とそれがどこにでもある理由

context.ContextがGoのほぼすべての関数で見られる理由、context.Contextがフリーズを防ぎ、操作のライフタイムを管理する方法を分析します。

К

Kodik

著者

1分で読める

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

詳しく見ていきましょう。

Goのコンテキストとは

context.Contextは、呼び出しチェーンを介して渡され、以下を管理する特別なオブジェクトです。

  • トランザクションの寿命、

  • プロセスのキャンセル、

  • 締め切り、

  • メタデータの転送(クエリIDなど)。

コンテキストは、関数が呼び出しとともに受け取り、そこから有用な情報を取得できる「目に見えないバックパック」のようなものです。

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

コンテキストが最もよく見られる場所

  1. ネットワークリクエストの処理 — 応答が長時間届かない場合は、タイムアウトでキャンセルします。

  2. データベースへのクエリ — 接続を無限に「ぶら下げ」ないようにするため。

  3. 背景のゴルチナ — サービス終了時の 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の世界のニュースを共有し、興味深いタスクを分析し、コミュニティとコミュニケーションを取る場所です。最も重要なものを見逃さないように、サブスクライブしてください。

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要