在 Go 中,defer 关键字可用于延迟函数的执行,直到周围的函数返回。但是,当与匿名闭包一起使用时,行为可能会有所不同,具体取决于闭包捕获其参数的方式。
考虑以下代码:
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 }
在第 2 部分中,闭包不捕获任何参数。这意味着当执行闭包时,变量 i 具有执行 defer 语句时的值。在这种情况下,i 将具有 for 循环最后一次迭代的值,即 4。因此,第 2 部分的输出将是:
4 4 4 4 4
在第 3 部分中,闭包捕获参数 n,该参数在创建闭包时被初始化为 i 的值。这意味着当执行闭包时,n 将具有执行 defer 语句时的值。在这种情况下,每个闭包捕获不同的 i 值,从而产生输出:
4 3 2 1 0
第 2 部分和第 3 部分之间的主要区别在于第 2 部分捕获 i可变,而第 3 部分则不然。这会影响闭包执行时的行为,导致不同的输出。
以上是Go闭包中如何延迟捕获参数?的详细内容。更多信息请关注PHP中文网其他相关文章!