Defer

Defer #

// Il built-in _defer_ può essere utilizzato per assicurarci
// che una funzione venga eseguita in un secondo momento,
// ad esempio per scopi di pulizia o per rilasciare delle
// risorse. Può essere assimilata alle keywork `ensure` o
// `finally` di altri linguaggi.
package main

import "fmt"
import "os"

// Supponiamo di voler creare un file, ci scriviamo
// all'interno e dopo vogliamo chiuderlo. Ecco come possiamo
// farlo utilizzando `defer`.
func main() {

    // Subito dopo aver creato un file con la funzione
    // `createFile`, utilizziamo `defer` su `closeFile`.
    // Questa funzione sarà eseguita al termine della funzione
    // dentro la quale è stata chiamata (in questo caso
    // `main`), appena la funzione `writeFile` avrà terminato.
    f := createFile("/tmp/defer.txt")
    defer closeFile(f)
    writeFile(f)
}

func createFile(p string) *os.File {
    fmt.Println("creazione")
    f, err := os.Create(p)
    if err != nil {
        panic(err)
    }
    return f
}

func writeFile(f *os.File) {
    fmt.Println("scrittura")
    fmt.Fprintln(f, "data")
}

func closeFile(f *os.File) {
    fmt.Println("chiusura")
    f.Close()
}
# Se si esegue il programma si ha la conferma che il file
# viene chiuso dopo che il contenuto è stato scritto
$ go run defer.go
creazione
scrittura
chiusura