2016-04-18 2 views

ответ

8

http.Client не требует специального способа освобождения «используемых» ресурсов. Когда он становится недоступным, память, используемая им, будет возвращена сборщиком мусора.

http.Client не хранит информацию о соединении или состоянии. В документации говорится, что даже http.Client должны быть повторно использованы:

Транспорт Клиента, как правило, имеет внутреннее состояние (кэшированные соединения TCP), так что клиенты должны быть повторно использованы вместо создаются по мере необходимости. Клиенты безопасны для одновременного использования несколькими гортанами.

Если вы строите свой собственный клиент, используя (например, вложение) 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():

Когда эээ nil, resp всегда содержит non-nil resp.Body. Абонент должен закрыть resp.Body, когда закончите читать с него.

+0

Клиентская доза не требует специального вызова функции, но если используется response.Body (результат вызова Do или Get/Post/...), вы должны закрыть его с помощью 'resp.Body .Close() ' – fzerorubigd

+0

@fzerorubigd Но это не метод' http.Client', и он не имеет ничего общего с 'http.Client'. Он не освобождает ресурсы, связанные с http.Client, а также ресурсы, связанные с соединением. – icza

+1

Я знаю. и я это сказал. но это обычная ошибка при использовании http.Client в любом случае (это делается один раз), и я думаю, что это неплохая идея упомянуть об этом здесь :) – fzerorubigd

Смежные вопросы