2019-10-08 22:20:58 +03:00

54 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// _Defer_ используется, чтобы гарантировать, что
// вызов функции будет выполнен позже при выполнении
// программы, обычно для целей очистки. `defer` часто
// используется там, где в других языках используются
// `ensure` и `finally`.
package main
import (
"fmt"
"os"
)
// Предположим, мы хотим создать файл, записать в него,
// а затем закрыть, когда закончим. Вот как нам поможет
// `defer`.
func main() {
// Сразу же после получения объекта файла с помощью
// `createFile` мы откладываем закрытие этого файла
// с помощью `closeFile`. Она будет выполнена в
// конце включающей функции (`main`) после завершения
// `writeFile`.
f := createFile("/tmp/defer.txt")
defer closeFile(f)
writeFile(f)
}
func createFile(p string) *os.File {
fmt.Println("creating")
f, err := os.Create(p)
if err != nil {
panic(err)
}
return f
}
func writeFile(f *os.File) {
fmt.Println("writing")
fmt.Fprintln(f, "data")
}
func closeFile(f *os.File) {
fmt.Println("closing")
err := f.Close()
// Важно проверять наличие ошибок при закрытии файла,
// даже в отложенной функции.
if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}