Goプログラミング言語チームは、バージョン1.27において、HTTP/1接続の再利用方法を改善するために`net/http`標準ライブラリを更新しました。以前は、開発者がHTTPレスポンスボディを完全に読み取らずに閉じた場合、サーバー側のバッファに未消費のデータが残っているため、基礎となるTCP接続が破棄されることがありました。これを防ぐため、Goランタイムは、ボディが閉じられた際に、保守的な制限時間内において残りのボディデータを非同期で自動的にドレインしようと試みるようになります。

この変更は、手動のボイラープレートコードの必要性を減らすことで、開発者のエクスペリエンスを簡素化することを目的としています。このアップデートの前は、接続がリークしたり、早すぎるタイミングで閉じられたりするのを防ぐために、開発者は`drainAsyncAndCloseBodyWithTimer`のような複雑なロジックを実装しなければならないことが多くありました。これを内部で処理することで、Go 1.27はより効率的なコネクションプーリングを可能にします。例えば、あるユーザーは、HTTP/1を使用してターゲットに対して100件のリクエストを実行した際、Go 1.26では約710ミリ秒だったパフォーマンスがGo 1.27では150ミリ秒に向上したと報告しており、新しい接続を確立するためのオーバーヘッドが大幅に削減されたことを示唆しています。

しかし、この自動化には特定のトレードオフとエッジケースが存在します。ランタイムがボディをドレインしようとするため、`Close()`の動作はダウンロードが即座に停止することを保証するものではなくなります。代わりに、システムはバッファをクリアするために短い期間(最大50ミリ秒)待機します。これは、開発者が帯域を節約するために意図的に大きなボディをスキップしたいシナリオに影響を与える可能性があります。さらに、一部のユーザーは、JSONデコーダーのような特定のツールが、適切に処理されない場合に接続の再利用を妨げる末尾の改行を残す可能性があることを指摘しました。この変更は全体的なパフォーマンスを向上させますが、開発者は「Close」操作が、低レベルのソケットコマンドというよりも、高レベルのリクエストライフサイクルのシグナルに近いものになったことを認識する必要があります。