2015-09-12 17 views
9

Czy wydawanie wielu oświadczeń defer jest bezpieczniejsze czy bardziej idiotyczne, czy też odłożenie anonimowej funkcji, która pakuje logikę?Wielokrotne odrzucenia kontra odroczona funkcja anonimowa

Przykłady:

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

W przypadku powyżej składni jest minimalna, ale kolejność odsuwa się do tyłu z logiką do wykonania.

W przypadku poniżej linii jest więcej, więcej „składni”, ale logika jest w bardziej naturalnej kolejności:

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

który z nich korzystać?

+1

Tylko mała uwaga (nie warta pełnej odpowiedzi), że "odroczyć" ma koszt wydajności. Jest bardzo mały (~ 75 ns zgodnie z moimi testami na go1.5.1 linux/amd64) i prawdopodobnie nie warto się nad tym zastanawiać, ale nadal należy to zauważyć. – HectorJ

Odpowiedz

10

W tym przykładzie funkcja anonimowa jest łatwiejsza do odczytania, szczególnie po dodaniu obsługi błędów.

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) 
    } 
}() 

Jeśli masz wiele zasobów, zwykle wystarczająca jest liczba defer s.

Powiązane problemy