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

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

最佳答案

您的代码完全符合预期:

func main() {
    defer applicationExit()
}

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


  • 等待main退出,然后调用applicationExit()


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


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


  • 如果编写此实际代码,则会得到类似以下内容的信息:
    func main() {
        cleanup := applicationExit() // Call applicationExit() immediately
        defer cleanup() // Wait until main() exits, then call cleanup()
    }
    

    可以缩短为:
    func main() {
        defer applicationExit()()
    }
    

    关于go - 如何推迟函数返回的匿名函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56472601/

    10-12 14:42