Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes.
簡単に訳すと、こんな感じ
処理の締め切り・キャンセル信号・API 境界やプロセス間を横断する必要のある
リクエストスコープな値を伝達させることができます。
context の定義は以下の通りです
0 の状態からコンテキストを生成するにはcontext.Backgroud()
を用いる
これは、「キャンセルされない」「deadline を持たない」「共有する値を持たない」状態
上記で初期化した値にcontext.WithCancel()
を渡すことで、
「Done
からキャンセル有無が判断できる context」と「戻り値のコンテキストをキャンセルするための関数」を取得できます
例えば、以下のような形で渡すことで動作する
context.WithDeadline()
は、引数で渡された親 context の設定を引き継いだ上で
Done メソッドチャネルが第二引数で指定した時刻に自動で close される新たな context になる
タイムアウト前にキャンセルを行うたい場合は、cancel()
を呼び出すことでも close できる
context.WithDeadline()
を使うことで時刻タイムアウトをできましたが、
context.WithTimeout()
を使うことで時間でタイムアウトさせることも可能です
これにより、gen チャネルの close 処理が行われるようになる
そのため、タイムアウトかどうかを判定するにはgenチャネルからの受信が、 チャネルcloseによるものか否か
を見るだけで判定できる
第二引数の bool を確認することで、その context がタイムアウトに設定されるか判定できる
設定されている場合は、第一引数にタイムアウト時刻が格納される
context の Err メソッドは、context がキャンセルされた時は nil
明示的にキャンセルされた場合は、Canceled エラー
タイムアウトしていた場合は、DeadlineExceeded エラー
WithValue を使うことで、context に値を加えることができます。
引数 key は key が、val には value を内部に持ちます。