Что такое defer в go и на что оно способно

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

Что такое defer в go и на что оно способно
  • Выражение defer добавляет функцию в стек, и она будет вызвана в обратном порядке, то есть последняя добавленная функция будет вызвана первой. Например, если вы напишете такой код:
package main import "fmt" func main() { defer fmt.Println("World") defer fmt.Println("Hello") }

То вывод будет таким:

Hello World

«Мы есть то, что мы едим» сказал однажды Гиппократ, отец медицины. Заходи гостем будешь

  • Аргументы отложенной функции оцениваются немедленно, а не в момент вызова. Это значит, что если вы измените значение переменной, переданной в defer, это не повлияет на результат отложенной функции. Например, если вы напишете такой код:
package main import "fmt" func main() { x := 10 defer fmt.Println(x) // x = 10 x = 20 fmt.Println(x) // x = 20 }

То вывод будет таким:

20 10
  • Выражение defer может быть использовано в цикле, но нужно быть осторожным, чтобы не создать слишком много отложенных функций, которые будут выполняться только при выходе из цикла. Это может привести к утечке памяти или нежелательным побочным эффектам. Например, если вы напишете такой код:
package main import "fmt" func main() { for i := 0; i < 5; i++ { defer fmt.Println(i) } }

То вывод будет таким:

4 3 2 1 0

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

package main import "fmt" func add(x, y int) (result int) { defer func() { result = x + y }() return 0 } func main() { fmt.Println(add(10, 20)) // result = 30 }

То вывод будет таким:

30
Начать дискуссию