Golang コンテキストの使用法の詳細な紹介

PHPz
リリース: 2023-04-11 10:12:48
オリジナル
1244 人が閲覧しました

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 コンテキストの使用

  1. Deadline メソッド

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()の戻り値によりプログラムは終了します。

  1. 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 関数を呼び出し、コンテキストを終了し、プログラム全体を終了します。

  1. Err メソッド

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関数の実行が終了しました」と出力します。

  1. Value メソッド

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート