如何推迟函数返回的匿名函数

Awe*_*ity -2 go deferred

假设您有一个函数可以设置应用程序服务器并返回一个应在应用程序退出前立即运行的函数。

func main() {
  defer applicationExit()
}

func applicationExit() func() {
  fmt.Println(" Application Setup Call")

  return func() {
    fmt.Println("Application Tear Down Call")
  }
} 
Run Code Online (Sandbox Code Playgroud)

您将获得以下输出。 Output: Application Setup Call

什么地方出了错?为什么我们看不到输出Application Tear Down Call

Fli*_*mzy 5

您的代码完全符合预期:

func main() {
    defer applicationExit()
}
Run Code Online (Sandbox Code Playgroud)

将该代码翻译成英文,意思是:

  • 等待直到main退出,然后致电applicationExit()

这就是发生的情况。但是,您似乎想要的是:

  • applicationExit()立即执行,并存储返回值以备后用。
  • 等待应用程序退出,然后调用所返回的匿名函数applicationExit()

如果我们编写此实际代码,则会得到类似以下内容的信息:

func main() {
    cleanup := applicationExit() // Call applicationExit() immediately
    defer cleanup() // Wait until main() exits, then call cleanup()
}
Run Code Online (Sandbox Code Playgroud)

可以缩短为:

func main() {
    defer applicationExit()()
}
Run Code Online (Sandbox Code Playgroud)