2015-09-12 15 views
9

È più sicuro o più idiomatico emettere più istruzioni defer che dipendono dall'ordine o rinviare una funzione anonima che impacchetta la logica?Funzioni differenziali multiple vs anonime differite

Esempi:

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

Nel caso precedente la sintassi è minima, ma l'ordine di rinvia è inversa alla logica da eseguire.

Nel caso qui di seguito ci sono più linee, più "sintassi", ma la logica è in un ordine più naturale:

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

quale usare?

+1

Solo una piccola nota (non vale una risposta completa) che "differire" ha un costo in termini di prestazioni. È estremamente piccolo (~ 75 ns in base ai miei test su go1.5.1 linux/amd64) e probabilmente non vale la pena considerarlo, ma dovrebbe comunque essere notato. – HectorJ

risposta

10

In questo esempio, la funzione anonima è più facile da leggere, soprattutto quando si aggiunge la gestione degli errori.

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

Se si dispone di più risorse, quindi multipla defer s è generalmente appropriata.

Problemi correlati