👣 Особенности работы defer



Почему в данной ситуации сначала выводится "Second" и "Third" (хотя они должны идти после "First"), а "Fourth" как раз лишь только после "First"?

Ведь defer должен срабатывать перед закрытием функции, в которой он объявлен.

package main



import "fmt"



func main() {

defer fmt.Println(changePointer())

fmt.Println("First")

}



func changePointer() string {

defer fmt.Println("Third")

fmt.Println("Second")

return "Fourth"

}






Итак, не будем тянуть, сразу к сути.

changePointer() вызывается, потому что это необходимо для получения результата, который может быть использован в fmt.Println(changePointer()).

Функция changePointer выполняется, чтобы получить результат, который возвращается в main, и только после этого запланированные defer — вызовы выполняются.

Вот такие дела



@golang_interview