Go 中延迟闭包捕获
Go 的 defer 语句可用于在周围函数返回后执行函数。然而,当与闭包一起使用时,了解参数捕获的工作原理非常重要。
问题
考虑以下代码:
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 部分中,闭包捕获 i,它是对外部变量的引用。在第 3 部分中,闭包没有任何外部引用,因此每个调用都有不同的 n 值。
其他注意事项
以上是为什么在 Go 中延迟关闭捕获会导致意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!