Отложенное выполнение функций в Go

GolangGolangBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Инструкция defer используется для отложения выполнения функции до возврата окружающей функции. Она часто используется для обеспечения выполнения некоторой очистки после завершения функции, независимо от пути, по которому это достигается.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ErrorHandlingGroup(["Error Handling"]) go/ErrorHandlingGroup -.-> go/defer("Defer") subgraph Lab Skills go/defer -.-> lab-15467{{"Отложенное выполнение функций в Go"}} end

Defer

В этом практическом задании вам нужно использовать defer для создания файла, записи в него и закрытия файла после завершения операций.

  • Функция createFile должна создать файл с указанным путём и вернуть указатель на файл.
  • Функция writeFile должна записать строку "data" в файл.
  • Функция closeFile должна закрыть файл и проверить наличие ошибок.
## Запуск программы подтверждает, что файл закрывается
## после записи.
$ go run defer.go
создаю
пишу
закрываю

Ниже представлен полный код:

// _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("создаю")
	f, err := os.Create(p)
	if err!= nil {
		panic(err)
	}
	return f
}

func writeFile(f *os.File) {
	fmt.Println("пишу")
	fmt.Fprintln(f, "data")

}

func closeFile(f *os.File) {
	fmt.Println("закрываю")
	err := f.Close()
	// Важно проверять наличие ошибок при закрытии файла,
	// даже в отложенной функции.
	if err!= nil {
		fmt.Fprintf(os.Stderr, "ошибка: %v\n", err)
		os.Exit(1)
	}
}

Резюме

В этом практическом задании вы узнали, как использовать defer для обеспечения выполнения вызова функции позже в ходе выполнения программы, обычно для целей очистки. Также вы узнали, как создать файл, записать в него и затем закрыть его с использованием defer.