Специфика работы defer

Рейтинг: 1Ответов: 1Опубликовано: 03.02.2023

Почему в данной ситуации сначала выводится "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"
}

Ответы

▲ 2Принят

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