Golang は効率的かつ簡潔な強力なプログラミング言語であり、現在急速に開発されています。 Go コードを作成する場合、各関数の入力パラメーターと出力パラメーターには独自のライフサイクルがあります。複数の Goroutine が同時に実行されている場合、プログラムの正確性を保証するためにコンテキストを管理する必要がある場合がありますが、これが Golang コンテキストの役割です。この記事では、Golang コンテキストの使い方を紹介します。
1. Golang Context の概念
Golang Context は、リクエスト範囲内の関連する値を含むオブジェクトです。このオブジェクトは関数間で渡すことができ、キャンセル操作のサポートを提供します。たとえば、HTTP リクエストを処理する場合、コンテキスト パッケージを使用して Http リクエストをパラメータとして渡し、リクエスト関連のコンテキストを取得できます。
Golang Context の構造定義は次のとおりです:
type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} }
上記の構造定義には Deadline、Done、Err、Value メソッドが含まれますが、以下ではそれぞれの機能を 1 つずつ紹介します。
2. Golang コンテキストの使用
Deadline メソッドは時刻とブール値を返します。コンテキストがキャンセルされるか、期限に達すると、コンテキストは今回はブール値 true を返し、それ以外の場合は false を返します。一部のコンテキストには期限がありません。その場合、Deadline メソッドは false を返します。
func main() { ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*5)) defer cancel() select { case <-time.After(3 * time.Second): fmt.Println("等待了3秒钟") case <-ctx.Done(): fmt.Println(ctx.Err()) } }
上記のコードでは、まず、現在の時刻から 5 秒後が期限である期限を持つコンテキストを作成します。次に、select ステートメントを使用して 3 秒間待機しますが、この時点では待機時間は Deadline を超えていないため、プログラムはまだ待機していることがわかります。最後に、期限を超えると、ctx.Done()の戻り値によりプログラムは終了します。
Done メソッドは読み取り専用チャネルを返します。コンテキストがキャンセルされるか、期限に達すると、このチャネルは閉じられます。したがって、コード内で select ステートメントと Done メソッドを使用して、コンテキストのステータスを監視できます。
func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() go func(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println(ctx.Err()) return default: fmt.Println("goroutine正在运行中...") time.Sleep(1 * time.Second) } } }(ctx) // 模拟耗时操作 time.Sleep(5 * time.Second) cancel() // 取消Context time.Sleep(3 * time.Second) fmt.Println("main函数执行结束") }
上記のコードでは、WithCancel 関数と cancel 関数を使用してコンテキストを開始および終了し、コンテキストがキャンセルされるまで goroutine で定期的にログを出力します。同時に、スリープを使用して、時間のかかる操作をシミュレートします。現在の関数は 5 秒後に cancel 関数を呼び出し、コンテキストを終了し、プログラム全体を終了します。
Err メソッドは、コンテキストがキャンセルされた理由を返します。キャンセルされたコンテキストの場合、このメソッドは null 以外のエラー値を返します。 Context がキャンセルされていない場合、Err メソッドは nil を返します。
func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() go func(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println(ctx.Err()) return default: fmt.Println("goroutine正在运行中...") time.Sleep(1 * time.Second) } } }(ctx) // 模拟耗时操作 time.Sleep(5 * time.Second) cancel() // 取消Context time.Sleep(3 * time.Second) fmt.Println("main函数执行结束") }
上記のコードでは、ゴルーチンで Err メソッドが使用されており、キャンセルの理由を返します。最後に、main関数で「main関数の実行が終了しました」と出力します。
Value メソッドは、interface{} 型のオブジェクトである Context に関連付けられた値を返します。 Context に任意のタイプの値を設定し、Value メソッドを使用して後続の操作で値を取得できます。
type authKey string func main() { ctx := context.WithValue(context.Background(), authKey("token"), "123456") fmt.Println(ctx.Value(authKey("token"))) // 打印"123456" }
上記のコードでは、WithValue メソッドを使用して文字列型の値を Context に関連付け、Value メソッドを使用して値を取得します。
3. 概要
Golang コンテキストは、同時実行コードの処理の重要な部分です。関数間で Context を渡すことにより、コード内でライフサイクルを管理でき、Done、Err、Value などのメソッドを通じて Context のステータスを監視することもできます。 Golang Context の使用をマスターすると、コードの品質と同時実行性が向上します。
以上がGolang コンテキストの使用法の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。