在 Go 中,“defer”语句允许函数推迟函数调用的执行,直到周围函数返回。当 defer 语句捕获闭包的参数时,此行为可能会导致意外结果。
第 2 部分与第 3 部分:捕获的参数
考虑以下代码:
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
第 2 部分:
在“第 2 部分”中,defer 语句创建一个捕获变量“i”的闭包。执行闭包时,“i”变量的值是在 range 语句的最后一次迭代中的值,即 4。因此,输出为“44444”。
第 3 部分:
在“第 3 部分”中,defer 语句创建了一个不捕获任何外部变量的闭包。当执行 defer 语句时,就会计算闭包的“n”参数,并在此时接收“i”的值。这会产生所需的输出“43210”,因为每个延迟函数调用对“n”使用不同的值。
要点:
理解 defer 语句的捕获行为对于避免 Go 中出现意外结果至关重要代码。
以上是Go 的 defer 语句如何处理闭包参数?的详细内容。更多信息请关注PHP中文网其他相关文章!