Изявлението defer (отлагане (на изпълнение))1 се
използва за осигуряване извикването на някоя функция
по-късно в работата на някоя програма. defer се
използва в същия смисъл, в какъвто биха се използвали в
други езици например ensure и finally.
import (
"fmt"
"os"
"path/filepath"
)
Да предположим, че искаме да създадем файл, да напишем
нещо в него и после да го затворим. Ето как бихме
направили това, като употребим и defer.
func main() {
Веднага след като получим обект за файл от
функцията createFile, ние отлагаме затварянето на
файла, като извикваме отложено closeFile. това
извикване ще се изпълни в края на обгръщатата
функция (в случая – main), след като writeFile
е приключила.
path := filepath.Join(os.TempDir(), "defer.txt")
f := createFile(path)
defer closeFile(f)
writeFile(f)
}
func createFile(p string) *os.File {
f, err := os.Create(p)
fmt.Println("създаваме", f.Name())
if err != nil {
panic(err)
}
return f
}
func writeFile(f *os.File) {
fmt.Println("пишем в ", f.Name())
fmt.Fprintln(f, "данни")
}
Важно е да се проверява за грешки, когато затваряме файл дори в отложена функция.
func closeFile(f *os.File) {
fmt.Println("затваряме", f.Name())
err := f.Close()
if err != nil {
panic(err)
}
}
Като пуснем програмата тя потвърждава, че файлът е затворен, след като сме писали в него.
$ go run defer.go
създаваме /tmp/defer.txt
пишем в /tmp/defer.txt
затваряме /tmp/defer.txt
Следващ пример: Възстановяване.