@nipler

Объясните почему так работает defer в GO?

Почему defer вызывается в начале выполнения функции? Я понимаю что defer вызывается снизу вверх, кто последний пришел тот первый ушел. Но почему была вызвана f() внути fmt.Println ?

package main

import "fmt"

func adder(sum int) func(int) int {
  return func(x int) int {
    sum += 1
    fmt.Printf("type %d sum %d\n", x, sum)
    return sum
  }
}

func main() {
  f := adder(5)
  defer func(){
    fmt.Println("defer 3 result", f(3))
  }()
  defer fmt.Println("defer 2 result", f(2))
  f(1)
}


Результат

type 2 sum 6
type 1 sum 7
defer 2 result 6
type 3 sum 8
defer 3 result 8
  • Вопрос задан
  • 389 просмотров
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
https://go.dev/blog/defer-panic-and-recover

A deferred function’s arguments are evaluated when the defer statement is evaluated.


Т.е. функция fmt.Println выполнится в конце, но её аргументы "defer 2 result" и f(2) вычисляются сразу.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы