Golang 的 Defer 语句中的闭包捕获
Golang 的 defer 语句允许在函数返回后执行清理操作。然而,与大多数语言不同的是,defer 创建的闭包不会捕获周围函数中变量的当前状态,而是在执行 defer 语句时对它们进行求值。
理解第 2 部分与第 2 部分3
在给定的代码中,第2部分和第3部分之间的区别在于闭包如何捕获变量i.
第 2 部分:
for i := range whatever { defer func() { fmt.Println(i) }() }
在第 2 部分中,闭包直接捕获变量 i。当闭包中的代码执行时(循环完成后),i 的值由循环的最终迭代确定,即 4。这就是为什么第 2 部分输出“44444”。
第 3 部分:
for i := range whatever { defer func(n int) { fmt.Println(n) }(i) }
在第 3 部分中,闭包不会直接捕获 i,而是创建一个新变量 n 和在执行 defer 语句时为其分配 i 的值。由于 defer 语句针对循环的每次迭代执行,因此每个闭包都有不同的 n 值。这会导致输出“43210”。
关键点:
要记住的关键概念是,当 defer 时,defer 中的闭包内的代码不会被执行。语句被执行。相反,用于确定闭包参数的表达式(例如,本例中的 i)在 defer 语句执行时被评估。
以上是Golang的Defer语句如何捕获循环中的变量?的详细内容。更多信息请关注PHP中文网其他相关文章!