一尘不染

如何在Go中释放http.Client?

go

我建立了一个http.Client用于HTTP2的连接,我该怎么做才能释放客户端和使用的资源?


阅读 389

收藏
2020-07-02

共1个答案

一尘不染

http.Client不需要任何特殊方法来释放“已用”资源。当它变得不可访问时,垃圾收集器将回收它使用的内存。

http.Client不存储连接或状态信息。该文档甚至指出http.Client应重用:

客户端的传输通常具有内部状态(缓存的TCP连接),因此应重新使用客户端,而不是根据需要创建客户端。客户端可以安全地被多个goroutine并发使用。

如果使用(例如,嵌入)构建自己的客户端,http.Client并分配必须显式释放的资源,请Close()在其上提供自己的方法,并记录使用自己的实现的任何人都必须调用Close()该方法(如果不再需要该调用)。

注意:

你可能会混淆的是,如果你使用一个http.Client做HTTP操作(如Client.Do()Client.Get()Client.Post()等),它们返回的值*http.Response,以及响应不保持连接,状态和其他资源,这
确实 需要被释放,通常通过Response.Body.Close()。引用以下软件包的文档http

完成后,客户端必须关闭响应主体:

resp, err := http.Get("http://example.com/")
if err != nil {
  // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...

它也记录在Client.Get()

当err为nil时,resp始终包含非nil resp.Body。呼叫者从其读取完成后应关闭resp.Body。

2020-07-02