php小编百草在解决编程问题时,发现了一个常见的goroutine泄漏情况。当我们尝试使用`ReadAll(response.Body)`时,返回的`response`对象是由`http`包的`client.Do(…)`方法返回的。然而,这种操作会导致goroutine泄漏的问题。为了避免这种情况的发生,我们需要采取一些措施来正确处理http响应。,该问题来自一个非常常见的场景,即在 http 方法调用后从响应正文中读取所有字节。,在 https://github.com/uber-go/goleak 的帮助下,我发现了一个有趣的 goroutine 泄漏。,为了演示该问题,请使用 go test
运行以下测试代码,这会导致 found 出现意外的 goroutine
:,完整测试输出:,有人知道如何解决这个问题吗?,谢谢!,在 Go 中,http.Client 使用 Transport(http.RoundTripper 接口)。 http.Transport 是它的默认实现。默认的 http.Transfer 维护一个连接池,其中保存由于某种原因保持活动或空闲的连接。,基本上,您需要做的就是确保在调用goleak.Verify时池中没有连接*,这可以通过以下方式完成:,