Тест
Вопрос 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`.