首页 >后端开发 >Golang >为什么在 Go 的 `defer` 语句中的闭包体后面使用'( )”?

为什么在 Go 的 `defer` 语句中的闭包体后面使用'( )”?

Barbara Streisand
Barbara Streisand原创
2024-12-02 18:55:11702浏览

Why Use

Go 中闭包体中“( )”背后的原理

Go 中,在闭包体后添加“( )”并不特定于闭包,而是适用于 defer 语句中的任何函数调用。语言规范要求 defer 语句中的表达式必须始终是函数调用。

考虑示例:

defer f()

此表达式尝试推迟函数 f 本身的执行,这是没有意义的。相反,正确的语法是:

defer f()()

这会构造一个闭包,捕获当前上下文并在激活 defer 语句时执行函数 f。外面的括号立即执行闭包,确保函数调用在 defer 语句执行后发生。

这种语法与 Go 中函数调用的一般用法一致,总是需要括号来执行它们。例如,要在定义闭包时打印 i 的值,请使用以下语法:

defer func(n int) { fmt.Println(n) }(i)

相反,要在执行闭包时打印 i 的值,请使用:

defer func() { fmt.Println(i) }()

理解这个原则可以清楚地理解 Go 中 defer 语句的行为以及闭包体内“( )”的正确用法,以及超越。

以上是为什么在 Go 的 `defer` 语句中的闭包体后面使用'( )”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn