首页 > 后端开发 > Golang > Go 延迟调用:参数是立即求值还是在函数执行时求值?

Go 延迟调用:参数是立即求值还是在函数执行时求值?

Mary-Kate Olsen
发布: 2024-12-06 00:44:11
原创
574 人浏览过

Go Deferred Calls: Are Arguments Evaluated Immediately or Upon Function Execution?

延迟调用的参数:立即计算与函数执行

在 Go 中,延迟函数调用允许您在周围函数返回后执行代码。但是,如果您不了解如何处理参数,则延迟调用的行为可能会令人困惑。

评估与执行

“Go 之旅”中的引述指出“延迟调用的参数会立即求值,但直到周围函数返回后才会执行函数调用。”这意味着:

  • 求值: 当您延迟函数调用时,将求值并捕获函数值及其参数。当调用封闭函数时会发生这种情况。
  • 执行:封闭函数返回后,执行延迟函数。

示例说明

让我们检查一下提供的示例:

func def(s string) func() {
    fmt.Println("tier up")
    fmt.Println(s)
    return func() { fmt.Println("clean up") }
}

func main() {
    defer def("defered line")()
    fmt.Println("main")
}
登录后复制

何时main() 被调用,会发生以下情况:

  1. defer 语句将参数计算为 def,它是常量字符串“defered line”。
  2. def 函数被调用“defered line”,打印“tier up”和“defered line”。
  3. def 的返回值是一个打印“clean up”的函数。该函数尚未执行。
  4. main() 打印“main”。
  5. main() 返回后,将执行延迟函数,打印“clean up”。

结论

理解参数求值和函数执行之间的区别对于在 Go 中有效使用延迟调用至关重要。执行 defer 语句时会立即计算参数,而函数体仅在封闭函数返回时执行。这使您可以控制执行操作的顺序,并避免与意外函数行为相关的潜在问题。

以上是Go 延迟调用:参数是立即求值还是在函数执行时求值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板