2016-09-02 5 views
0

行き先が新しいです。私はHTTPをやっている場合、要求はこの聞かせます:Golang - エラーをチェックして操作を延期する正しい順序は何ですか?

resp, err := http.Get("https://www.google.com") 

を今私はerrがnilとdefer resp.Body.Close()であるかどうかを確認する必要があります。これら2つの操作を実行する正しい順序は何ですか?

+0

クローズコールが延期されているため違いがないと思います。最初にエラーをチェックしてからクローズを延期するのは慣用的なようです。 – Sridhar

+2

@Sridhar:これは間違った**です!もしerr!= nilならばresp == nilとします。この場合、DeferされたBody.Close()はパニックに陥ります。 – Volker

+0

あなたは正しいです。ただ試しました。明らかに私はすべての私のエラーを直ちに処理するため、これを見いだすことはありません:) – Sridhar

答えて

2

Getへの呼び出しの直後にエラーがないかどうかを確認する必要があります。 Getが失敗した場合、respnilに設定されます。つまり、resp.Bodyはランタイムnil pointer dereferencedエラーを生成します。

resp, err := http.Get("https://www.google.com") 
if err != nil { 
    // process error 
    return err 
} 
defer resp.Body.Close() 
関連する問題