go - 如何延迟函数返回的匿名函数

标签 go deferred

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

func main() {
  defer applicationExit()
}

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

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

您将获得以下输出。 输出:应用程序设置调用

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

最佳答案

您的代码完全符合预期:

func main() {
    defer applicationExit()
}

翻译成英文,这段代码的意思是:

  • Wait until main exits, then call applicationExit().

事情是这样的。但是你似乎想要的是:

  • Execute applicationExit() immediately, and store the return value for later.
  • Wait until application exits, then call the anonymous function returned by 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/

相关文章:

go - 在golang中实现接口(interface)给方法有指针接收者

json - 如何解码不同数据类型的 JSON 数组?

testing - 如何测试延迟的 Go 语句?

python - 重复事件的延迟相当于什么?

javascript - 在返回结果之前,如何在 Promise.done 中等待 jQuery.ajaxComplete?

go - Golang 中具体类型的错误片段

go - 客户端 tls 身份验证问题

go - 具有关联的负载模型

python - Twisted Python - 如果 deferred 超出范围,它会被解雇吗?

javascript - jQuery 延迟/ promise