Когда мы закрываем тело, поведение различается в зависимости от того, прочитано что-то из него или нет:
- Если мы закроем тело без чтения, HTTP-транспорт, используемый по умолчанию, может закрыть соединение.
- Если мы закроем тело после чтения, используемый по умолчанию HTTP-транспорт не закроет соединение; следовательно, его можно будет использовать и далее.
Если `getStatusCode`` вызывается повторно и мы хотим использовать остающиеся неразорванные соединения, то нужно прочитать тело, даже если его содержание нас не интересует:
func (h handler) getStatusCode(body io.Reader) (int, error) {
resp, err := h.client.Post(h.url, "application/json", body)
if err != nil {
return 0, err
}
// Закрытие тела ответа
defer func() {
err := resp.Body.Close()
if err != nil {
log.Printf("failed to close response: %v\n", err)
}
}()
_, _ = io.Copy(io.Discard, resp.Body) // чтение тела ответа "в никуда"
return resp.StatusCode, nil
}