К вопросам

Defer

Тест · Вопрос 3 из 3

Тест

Вопрос 3

Два числа подряд: что выведут два вызова `fmt.Println` в `main` (сначала результат `testDefer`, затем `testDefer2`)?

Go
package main

import "fmt"

func testDefer() int {
	i := 0
	defer func() {
		i = 2
	}()

	return i
}

func testDefer2() (i int) {
	i = 0
	defer func() {
		i = 2
	}()

	return i
}

func main() {
	fmt.Println(testDefer())
	fmt.Println(testDefer2())
}
Варианты ответа

Выберите один ответ

В `testDefer` возвращаемое значение копируется до запуска `defer`: наружу уходит `0`, а в замыкании меняется локальная `i`, уже не влияющая на результат. В `testDefer2` у результата имя `i`: отложенная функция изменяет именованную переменную результата до фактического возврата, поэтому второе число — `2`.