在这篇文章中),指出了response.Body应该被关闭以避免资源泄漏。它也显示在http软件包godoc的概述示例中。
在测试代码中,我发送了多个请求以尝试使用
resp, err := http.DefaultClient.Do(req)
在同一功能中多次。这是不好的做法吗?在这种情况下,我要defer resp.Body.Close()在每本书之后写一次还是只写一次?
defer resp.Body.Close()
url := server.URL + "/ticket/add" reader = strings.NewReader(`{"id": "test1", "detail": "test1"}`) req, err := http.NewRequest("POST", url, reader) assert.Nil(t, err) resp, err := http.DefaultClient.Do(req) assert.Nil(t, err) defer resp.Body.Close() assert.Equal(t, http.StatusCreated, resp.StatusCode) // add a ticket with same id reader = strings.NewReader(`{"id": "test1"}`) req, err = http.NewRequest("POST", url, reader) assert.Nil(t, err) resp, err = http.DefaultClient.Do(req) assert.Nil(t, err) assert.Equal(t, http.StatusInternalServerError, resp.StatusCode)
在服务器端(即)内部的相关问题,func(w http.ResponseWriter, r *http.Request)是否也需要关闭请求主体?
func(w http.ResponseWriter, r *http.Request)
是的,您需要关闭两个回复。推迟一个呼叫resp.Body.Close不会以某种方式影响另一个。*http.Response每种情况下的都不同,并且两者都可以推迟。
resp.Body.Close
*http.Response
在服务器端,您无需关闭文档中的Request.Body- :http.Request
Request.Body
http.Request
// The Server will close the request body. The ServeHTTP // Handler does not need to.