Go言語 Contextの使い方:基本から応用まで徹底解説

Go言語では、Contextはデータの送受信、キャンセルシグナルの処理、そしてリクエストの終了時間を管理するために使用されます。Contextはインターフェース型であり、以下のように定義されます。

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

Contextの基本的な手順は以下の通りです:

  1. 文脈を作成します。

例えば、context.Background()関数を使用して空のContextを作成することもできますし、context.WithCancel()やcontext.WithDeadline()、context.WithTimeout()関数を使用してキャンセル、期限、タイムアウトを持つContextを作成することもできます。

ctx, cancel := context.WithCancel(context.Background())
defer cancel()
  1. Contextを渡す必要がある関数で、Contextを引数として渡す

関数の署名で、Contextを最初の引数として指定することで、そのContextを関数内で使用できるようになります。 例えば:

func doSomething(ctx context.Context) {
    // 使用ctx进行操作
}
  1. コンテキストを使用してリクエストのライフサイクルを管理する

Contextを使って、締め切り時間を取得したり、キャンセルシグナルを受け取ったり、Contextが終了したかどうかを判断したりすることができます。例えば:

deadline, ok := ctx.Deadline()
done := ctx.Done()
err := ctx.Err()
  1. コンテキストを介してデータを渡す

Context内のデータを伝達するために、ContextのValue()メソッドを使用できます。キーは比較可能なタイプでなければならず、値は任意のタイプである可能性があります。例:

key := "key"
value := "value"
ctx := context.WithValue(context.Background(), key, value)

総じて、Contextを使うことでリクエストのライフサイクルの管理、並行処理の制御、データの伝達などが効果的に行えます。Go言語の標準ライブラリには、多くのパッケージがContextをサポートするAPIを提供しています。

bannerAds