Go json.NewDecoder().Decode() コンテキスト期限の問題
Go プログラムでは、コンテキスト期限はタイムアウトを設定する手段を提供します。特定の操作。しかし、ユーザーは json.NewDecoder().Decode() の使用時に予期しない動作を報告しました。
ユーザーの懸念
ユーザーは json.NewDecoder() を期待していました。 Decode() を使用して、プログラムに設定されたコンテキストの期限を尊重します。彼らは、ioutil.ReadAll() を使用して応答本文を読み取ると、予想どおりコンテキスト期限超過エラーが発生することを観察しました。ただし、json.NewDecoder().Decode() に切り替えると、経過時間が期限を超えていたにもかかわらず、エラーは報告されませんでした。
コード例
<code class="go">ctx, _ := context.WithTimeout(context.Background(), time.Second*5) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) ... time.Sleep(time.Second * 6) fmt.Println("before reading response body, context error is:", ctx.Err()) err = json.NewDecoder(resp.Body).Decode(ipResponse) if err != nil { panic(err) } fmt.Println("Expected panic but there was none")</code>
回答
動作の不一致は、net/http パッケージ内のバッファの使用に起因します。応答のサイズと構成に応じて、本文は読み取られる前に部分的または完全にバッファリングされる場合があります。これは、json.NewDecoder().Decode() が使用される場合、期限切れのコンテキストによってバッファされたデータへのアクセスが妨げられない可能性があることを意味します。
これを説明するために、応答本文を意図的に遅延させるテスト サーバーが作成されました。 。 net/http パッケージの部分的なバッファリング動作をシミュレートしました。このテスト サーバーで readDoesntFail() が実行されると、予想されるコンテキスト期限超過エラーが実際にトリガーされました。
結論
ユーザーのコードで観察された動作は、潜在的な問題を浮き彫りにしています。コンテキスト期限のある json.NewDecoder().Decode() を使用する場合の注意事項。応答本文が大きく、完全にバッファリングされている場合、コンテキストの期限が期待どおりに適用されない可能性があることに注意することが重要です。
以上がjson.NewDecoder().Decode() は、応答本文がバッファリングされるときにコンテキストの期限を尊重しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。