2016-04-18 5 views

Antwort

8

http.Client erfordert keine spezielle Möglichkeit, "gebrauchte" Ressourcen zu befreien. Wenn es nicht mehr erreichbar ist, wird der von ihm verwendete Speicher vom Garbage Collector zurückgewonnen.

http.Client speichert keine Verbindungs- oder Statusinformationen. In der Dokumentation wird auch, dass http.Client wiederverwendet werden sollte:

Der Transport des Kunden hat in der Regel einen internen Zustand (im Cache TCP-Verbindungen), so Clients statt erstellt wiederverwendet werden sollte je nach Bedarf. Clients sind sicher für die gleichzeitige Verwendung durch mehrere Gloutines.

Wenn Sie Ihren eigenen Client (zB Einbettung) bauen http.Client und Sie Ressourcen zuweisen, die explizit freigegeben werden muss, geben Sie Ihre eigenen Close() Methode auf sie und dokumentieren, dass jeder, der eine eigene Implementierung verwendet Close() nennen müssen, wenn es wird nicht mehr benötigt.

Hinweis:

Was Sie könnte es verwechseln mit, dass, wenn Sie einen http.Client verwenden HTTP-Operationen zu tun (wie Client.Do(), Client.Get(), Client.Post() etc.), sie einen Wert von *http.Response zurückkehren, und diese Antwort hält eine Verbindung, Zustand und andere Ressourcen, die müssen freigegeben werden müssen, in der Regel über . Zitiert aus dem Paket doc von http:

Der Kunde muss die Antwort Körper schließen, wenn sie mit ihm fertig:

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

Es ist auch bei Client.Get() dokumentiert:

Wenn err ist nil, bzw. enthält immer ein non-nil resp.Body. Der Anrufer sollte bzw. schließen, wenn das Lesen beendet ist.

+0

Der Kunde keinen speziellen Funktionsaufruf Dosis benötigen, aber wenn die response.Body (das Ergebnis des Aufrufs Do, oder Get/Post/... Funktionen) verwendet wird, müssen Sie es mit 'resp.Body schließen .Close() ' – fzerorubigd

+0

@fzerorubigd Aber das ist keine Methode von' http.Client', und es hat nichts mit 'http.Client' zu tun. Es werden keine Ressourcen freigegeben, die sich auf "http.Client" beziehen, sondern Ressourcen, die sich auf die Verbindung beziehen. – icza

+1

Ich weiß. und ich sagte das. aber das ist der übliche Fehler bei der Verwendung von http.Client (das ist schon einmal gemacht) und ich denke es ist keine schlechte Idee es hier zu erwähnen :) – fzerorubigd