記事ディレクトリ
1. コンテキストが必要な理由
Go http パッケージのサーバーでは、各リクエストにはそれを処理する対応する goroutine があります。リクエスト処理関数は通常、データベースや RPC サービスなどのバックエンド サービスにアクセスするために追加のゴルーチンを開始します。
リクエストの処理に使用されるゴルーチンは、通常、エンド ユーザーの ID 認証情報、検証関連のトークン、リクエストの期限など、リクエストに固有のデータにアクセスする必要があります。リクエストがキャンセルまたはタイムアウトした場合、システムがこれらのゴルーチンによって占有されているリソースを解放する前に、リクエストの処理に使用されるすべてのゴルーチンがすぐに終了する必要があります。
2. コンテキストインターフェイス
context.Context
これは、実装する必要がある 4 つのメソッドを定義するインターフェイスです。
文法:
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{
}
Err() error
Value(key interface{
}) interface{
}
}
方法解释:
Deadline():返回当前Context被取消的时间,也就是完成工作的截止时间(deadline);
Done():返回一个Channel,这个Channel会在当前工作完成或者上下文被取消之后关闭,多次调用Done方法会返回同一个Channel;
Err():返回当前Context结束的原因,它只会在Done返回的Channel被关闭时才会返回非空的值;如果当前Context被取消就会返回Canceled错误;如果当前Context超时就会返回DeadlineExceeded错误;
Value():从Context中返回键对应的值,对于同一个上下文来说,多次调用Value 并传入相同的Key会返回相同的结果;
3. バックグラウンドメソッド
文法:
context.Background() Context
分析: Background() は主に main 関数、初期化、およびテスト コードで、最顶层
ルート コンテキストであるコンテキスト ツリー構造のコンテキストとして使用されます。
4. シリーズ機能付き
1.WithCancelメソッド
WithCancel は、新しい Done チャネルを含む親ノードのコピーを返します。返されたコンテキストの Done チャネルは、返された cancel 関数が呼び出されたとき、または親コンテキストの Done チャネルが閉じられたときに閉じられます。
文法:
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
2、WithDeadline 方法
deadline
d 以降に調整された親コンテキストのコピーを返します。親コンテキストの期限がすでに d より早い場合、WithDeadline(parent, d) は意味的に親コンテキストと同等です。返されたコンテキストの Done チャネルは、期限が切れたとき、返された cancel 関数が呼び出されたとき、または親コンテキストの Done チャネルが閉じられたときのいずれか早い時点で閉じられます。
文法:
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
3.WithTimeoutメソッド
WithTimeout は を返しますWithDeadline(parent, time.Now().Add(timeout))
。
文法:
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
4.WithValueメソッド
WithValue 関数は、リクエスト スコープ内のデータと Context オブジェクトの間の関係を確立できます。WithValue は、キーに関連付けられた値が val である親ノードのコピーを返します。
文法:
func WithValue(parent Context, key, val interface{
}) Context
5. 使用上の注意
- コンテキストをパラメータの形式で明示的に渡すことをお勧めします。
- Context をパラメータとして受け取る関数メソッドは、最初のパラメータとして Context を使用する必要があります。
- Context を関数メソッドに渡すときは、nil を渡さないでください。何を渡せばよいかわからない場合は、次を使用してください。
context.Background()
- Context の Value 関連メソッドは、リクエスト フィールドの必要なデータを渡す必要があり、オプションのパラメーターを渡すために使用しないでください。
- コンテキスト はい
线程安全
、複数のゴルーチンで安全に渡すことができます