Задачи на defer
1) Что выведет данная программа и почему?
package main
func main() {
digits := []int {1, 2, 3, 4, 5}
for _, d := range digits {
defer println(d)
}
}Данная программа на языке Go выводит числа от 5 до 1. Причина этого заключается в использовании оператора `defer` внутри цикла `for`.
Оператор `defer` в Go откладывает выполнение функции до того момента, пока не завершится выполнение окружающей функции, в данном случае `main()`. Важно отметить, что отложенные вызовы выполняются в порядке LIFO (Last In, First Out), то есть последний отложенный вызов выполняется первым.
В цикле `for` переменная `d` последовательно принимает значения от 1 до 5. Каждый раз, когда цикл достигает оператора `defer`, вызов `println(d)` добавляется в стек отложенных вызовов. После завершения цикла, когда функция `main()` начинает завершаться, отложенные вызовы `println(d)` выполняются в обратном порядке: от последнего добавленного к первому. Таким образом, на экран выводятся числа 5, 4, 3, 2, 1.
2) Что выведет данная программа и почему?
package main
import (
"fmt"
)
func main() {
i := 0
defer fmt.Println(i)
i++
return
}В этом коде используется оператор defer, который откладывает выполнение функции до тех пор, пока не завершится окружающая функция (main в данном случае). Давайте разберем, что произойдет пошагово.
Код
package main
import (
"fmt"
)
func main() {
i := 0
defer fmt.Println(i)
i++
return
}Объяснение
Инициализация переменной
i:i := 0Переменная
iинициализируется значением0.Оператор
defer:defer fmt.Println(i)Оператор
deferоткладывает выполнение функцииfmt.Println(i)до тех пор, пока функцияmainне завершится. Важно отметить, что аргументы функции, переданной вdefer, вычисляются сразу же, в момент вызоваdefer. Таким образом, в этот момент значениеiравно0, и именно это значение будет использовано при выполнении отложенной функции.Инкремент переменной
i:i++Значение переменной
iувеличивается на1, и теперьiравно1.Завершение функции
main:returnФункция
mainзавершает выполнение. В этот момент выполняются все отложенные функции, в порядке, обратном их объявлению.Выполнение отложенной функции:
fmt.Println(i)Отложенная функция
fmt.Println(i)выполняется, используя значениеi, которое было вычислено в момент вызоваdefer. Посколькуiбыло равно0в момент вызоваdefer, именно это значение будет напечатано.
Вывод
0Заключение
Оператор
deferоткладывает выполнение функции до завершения окружающей функции.Аргументы функции, переданной в
defer, вычисляются сразу же в момент вызоваdefer.В данном примере значение
iбыло равно0в момент вызоваdefer, поэтому именно это значение будет напечатано, когда отложенная функция выполнится.
Last updated