0Pricing
Go Academy · レッスン

context.Contextが存在する理由

キャンセルとリクエストのライフサイクル管理

「context.Contextが存在する理由」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

問題点

実行中の処理をキャンセルする仕組みがなければ、遅いデータベースクエリやHTTP呼び出しが完了するまでゴルーチンをブロックし続けます。元のリクエストがすでに破棄されている場合、これはリソースの浪費になります。

context.Contextの概要

context.Contextは、API境界やゴルーチンをまたいで、キャンセルシグナル、任意のデッドライン、キーと値のメタデータを運ぶインターフェースです。

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key any) any
}

Doneチャネル

ctx.Done()は、contextがキャンセルまたはタイムアウトしたときにクローズされるチャネルを返します。ゴルーチンはこのチャネルをselectしてキャンセルを検出します。

select {
case result := <-workCh:
    return result, nil
case <-ctx.Done():
    return nil, ctx.Err()
}

context.Background()

context.Background()はルートcontextです。キャンセルされず、デッドラインもなく、値も保持しません。リクエストの最上位、main、またはテストで使用します。

context.TODO()

context.TODO()もキャンセルできないルートcontextです。適切なcontextがまだ利用できない場合のプレースホルダーとして使用します。これにより、レビュー担当者に意図を伝えられます。

Contextを最初の引数に渡す理由

慣例として、キャンセル可能な関数の最初の引数はctx context.Contextにします。これにより、APIでキャンセルを明示的かつ見つけやすくできます。

func FetchUser(ctx context.Context, id int) (*User, error) {
    return db.QueryContext(ctx, "SELECT ...", id)
}

キャンセルは伝播します

親contextをキャンセルすると、そこから派生したすべての子contextもキャンセルされます。これにより、1回のキャンセル呼び出しでゴルーチンと操作のツリー全体を停止できます。

Contextではないもの

Contextは汎用的な値の入れ物ではありません。トレースIDや認証トークンなど、リクエストに紐づくデータにのみ使用し、オプションのパラメーターには使用しないでください。値は型付き構造体に保持します。

標準ライブラリとの統合

標準ライブラリのHTTPクライアント、SQLドライバー、gRPC、および多くのサードパーティーパッケージはContextを受け取るため、呼び出しスタック全体にキャンセルを伝播できます。

構造体へのContextの保存

Contextを構造体に保存しないでください。関数の引数として明示的に渡します。保存するとキャンセルの有効期間が不明確になり、バグにつながることがよくあります。

Contextは不変です

Contextは不変です。WithCancel、WithDeadline、WithTimeout、またはWithValueでラップして新しいcontextを派生させます。親は変更されません。

確認問題

ctx.Done()は何を返しますか。

まとめ: context.Context

要点:

  • ゴルーチン間でキャンセル、デッドライン、メタデータを伝えます
  • 最初の引数として渡し、構造体には保存しません
  • キャンセルまたはタイムアウトするとctx.Done()チャネルがクローズされます
  • キャンセルは親からすべての子へ伝播します

よくある質問

「context.Contextが存在する理由」レッスンは無料ですか?

はい。「context.Contextが存在する理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「context.Contextが存在する理由」で何を学びますか?

キャンセルとリクエストのライフサイクル管理 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「context.Contextが存在する理由」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. context.Contextが存在する理由
  2. WithCancelとWithTimeout
  3. WithDeadlineとWithValue
  4. HTTPとデータベース呼び出しにおけるContext
← Go Academyに戻る