2016-04-18 19 views

答えて

8

http.Client "使用済み"リソースを解放する特別な方法は必要ありません。それが到達不能になると、それによって使用されるメモリはガベージコレクタによって再利用されます。

http.Clientは、接続または状態情報を保存しません。ドキュメントはさえhttp.Clientが再利用されるべきであると述べている:

クライアントの交通クライアントが再利用の代わりに、必要に応じて作成されなければならないので、一般的に、内部状態(キャッシュされたTCPコネクションを)持っています。クライアントは、複数のゴルーチンによって同時に使用するのに安全です。

使用して、独自のクライアントを構築する場合(例えば埋め込む)http.Client、あなたは明示的に解放しなければならないリソースを割り当て、それをあなた自身のClose()方法を提供し、それがある場合は、独自の実装を使用して、誰もがClose()を呼び出す必要があることを文書もう必要ありません。

注:あなたがそれを混乱させる可能性が何

は、あなたが(Client.Do()Client.Get()Client.Post()などのような)HTTP操作を行うためにhttp.Clientを使用している場合、彼らは*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 respには常に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

関連する問題