2015-09-12 24 views
9

Siparişe bağlı olan birden fazla defer bildirimi oluşturmak veya mantığı paketleyen bir anonim işlevini ertelemek daha güvenli veya daha idiomatik mi?Birden çok erteleme vs ertelenmiş anonim işlev

Örnekler: sözdizimi Yukarıdaki durumda

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

az, henüz ertelemektedir sırası yürütülecek mantığa tersinedir.

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

hangisi kullanmak: durumunda aşağıda orada daha fazla satır, daha "sözdizimi", ama mantık daha doğal bir sırada bulunuyor ise

?

+1

Sadece küçük bir not (tam bir cevaba değil) 'defer' performansa sahip. Bu son derece küçük (go1.5.1 linux/amd64 üzerinde benim testlerime göre ~ 75 ns) ve muhtemelen dikkate değer değil, ama yine de not edilmelidir. – HectorJ

cevap

10

Bu örnekte, özellikle hata işlemine ekledikten sonra anonim işlev daha kolay okunur. Eğer birden fazla kaynak varsa

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

, sonra birden fazla defer ler genellikle uygundur.

İlgili konular