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

时间:2019-06-06 07:17:17

标签: go deferred

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

func main() {
  defer applicationExit()
}

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

  return func() {
    fmt.Println("Application Tear Down Call")
  }
} 

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

出了什么问题?为什么我们看不到输出Application Tear Down Call

2 个答案:

答案 0 :(得分:5)

您的代码完全符合预期:

func main() {
    defer applicationExit()
}

翻译成英文,此代码表示:

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

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

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

如果我们编写此 actual 代码,则会得到类似的内容:

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

可以缩写为:

func main() {
    defer applicationExit()()
}

答案 1 :(得分:3)

您必须调用返回的函数。 applicationExit()仅返回该函数,而不执行其他任何操作。要执行它,您必须调用该函数。

func main() {
  defer applicationExit()()
}

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

  return func() {
    fmt.Println("Application Tear Down Call")
  }
}