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中文网其他相关文章!