首页 > 后端开发 > Golang > 正文

Golang的Defer语句如何捕获循环中的变量?

DDD
发布: 2024-11-11 22:13:02
原创
359 人浏览过

How Does Golang's Defer Statement Capture Variables in a Loop?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板