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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- context.Contextが存在する理由
- WithCancelとWithTimeout
- WithDeadlineとWithValue
- HTTPとデータベース呼び出しにおけるContext