Что такое 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
Начать дискуссию