如何解决golang的“延迟”如何捕获闭包的参数?
“第2部分”闭包捕获变量“ i”。当闭包(稍后)中的代码执行时,变量“ i”具有在range语句的最后一次迭代中具有的值,即。‘4’。因此
4 4 4 4 4
输出的一部分。
“第3部分”在其闭包中未捕获任何外部变量。如规格所述:
因此,每个延迟的函数调用都具有不同的’n’参数值。它是执行defer语句时的’i’变量的值。因此
4 3 2 1 0
部分输出,因为:
需要注意的关键点是,在 执行 defer语句时,不会 执行 “ defer f()”中的“ f()”
当执行defer语句时,将 评估 “ defer f(e)”中的表达式“ e” 。
解决方法
这是我的代码(运行):
package main
import "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部分和第3部分有什么区别?为什么第2部分输出“ 44444”而不是“ 43210”?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。