Go 编程语言团队在 1.27 版本中更新了 `net/http` 标准库,以改进 HTTP/1 连接的复用方式。此前,如果开发者在未完全读取的情况下关闭了 HTTP 响应主体,底层的 TCP 连接可能会被丢弃,因为服务器在其缓冲区中仍有未消耗的数据。为了防止这种情况,Go 运行时现在将在关闭主体时自动尝试异步排空剩余的主体数据,且受限于一个保守的时间限制。

这一变化旨在通过减少手动样板代码的需求来简化开发者的体验。在这次更新之前,开发者经常不得不实现复杂的逻辑——例如 `drainAsyncAndCloseBodyWithTimer`——以确保连接不会泄漏或过早关闭。通过在内部处理此操作,Go 1.27 实现了更高效的连接池。例如,有一位用户报告称,使用 HTTP/1 对目标执行 100 次请求时,性能从 Go 1.26 的约 710 毫秒提升到 Go 1.27 的 150 毫秒,这表明建立了新连接的开销显著降低。

然而,这种自动化也引入了特定的权衡和边缘情况。由于运行时现在尝试排空主体,`Close()` 的行为不再保证下载会立即停止;相反,系统将等待很短的一段时间(最多 50 毫秒)来清除缓冲区。这可能会影响到开发者有意想要跳过大型主体以节省带宽的场景。此外,一些用户指出,某些工具(如 JSON 解码器)如果处理不当,仍可能留下尾随换行符,从而阻止连接复用。虽然这一变化提高了整体性能,但它要求开发者意识到,“Close”操作现在更多是一个高层级的请求生命周期信号,而非底层的套接字命令。