2015-09-12 9 views
9

複数のdeferステートメントを発行するか、ロジックをパッケージ化する無名関数を延期する方が安全か、より慣れていますか?複数の遅延と遅延無名関数

例:

defer os.Remove(tempFile.Name()) 
defer tempFile.Close() 

構文上記の場合は最小で、まだ延期の順序が実行されるロジックとは逆です。場合

は、以下の複数のラインは、より多くの「構文」はありますが、ロジックは、より自然な順序である:

defer func() { 
    tempFile.Close() 
    os.Remove(tempFile.Name()) 
}() 

使用するかを?

+1

'defer'にはパフォーマンスコストがあるだけです(完全な答えではありません)。これは非常に小さく(go1.5.1 linux/amd64に関する私のテストによれば~75 ns)、考慮する価値はないかもしれませんが、それでも注意する必要があります。 – HectorJ

答えて

10

この例では、特にエラー処理を追加すると、無名関数が読みやすくなります。

f, err := ioutil.TempFile("", "prefix") 
if err != nil { 
    log.Println("creating temp file:", err) 
    return 
} 
defer func() { 
    err := f.Close() 
    if err != nil { 
    log.Println("close:", err) 
    } 
    err = os.Remove(f.Name()) 
    if err != nil { 
    log.Println("remove:", err) 
    } 
}() 

複数のリソースがある場合は、通常は複数のdeferが適切です。

関連する問題