golang如何“推迟”捕获关闭参数?

golang如何“推迟”捕获关闭参数?,第1张

概述这是我的代码( run): package mainimport "fmt"func main() { var whatever [5]struct{} for i := range whatever { fmt.Println(i) } // part 1 for i := range whatever { defer 这是我的代码( run):
package mainimport "fmt"func main() {    var whatever [5]struct{}    for i := range whatever {        fmt.Println(i)    } // part 1    for i := range whatever {        defer func() { fmt.Println(i) }()    } // part 2    for i := range whatever {        defer func(n int) { fmt.Println(n) }(i)    } // part 3}

输出:

0
1
2
3
4
4
3
2
1
0
4
4
4
4
4

问题:第2部分和第2部分有什么区别?第3部分为什么第2部分输出“44444”而不是“43210”?

“第2部分”闭包捕获变量“i”。当闭包(稍后)中的代码执行时,变量“i”具有在范围语句的最后一次迭代中具有的值,即。 ‘4’。因此
4 4 4 4 4

输出的一部分。

“第3部分”没有捕获其关闭中的任何外部变量。正如specs所说:

Each time the “defer” statement executes,the function value and parameters to the call are evaluated as usual and saved anew but the actual function is not invoked.

所以每个被称为的函数调用都具有不同的’n’参数值。在执行延迟语句的时刻,它是’i’变量的值。因此

4 3 2 1 0

部分输出因为:

… deferred calls are executed in liFO order immediately before the surrounding function returns …

要注意的一点是,当defer语句执行时,’defer f()’中的’f()’不执行

在延迟语句执行时,会对’defer f(e)’中的表达式’e’进行评估。

总结

以上是内存溢出为你收集整理的golang如何“推迟”捕获关闭参数?全部内容,希望文章能够帮你解决golang如何“推迟”捕获关闭参数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1280865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存