首页 > 后端开发 > Golang > Go闭包中如何延迟捕获参数?

Go闭包中如何延迟捕获参数?

Mary-Kate Olsen
发布: 2024-11-10 17:53:02
原创
384 人浏览过

How Does Defer Capture Parameters in Go Closures?

在带或不带参数的 Go 中延迟捕获

在 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 部分:不带参数的闭包

在第 2 部分中,闭包不捕获任何参数。这意味着当执行闭包时,变量 i 具有执行 defer 语句时的值。在这种情况下,i 将具有 for 循环最后一次迭代的值,即 4。因此,第 2 部分的输出将是:

4 4 4 4 4
登录后复制

第 3 部分:带参数的闭包

在第 3 部分中,闭包捕获参数 n,该参数在创建闭包时被初始化为 i 的值。这意味着当执行闭包时,n 将具有执行 defer 语句时的值。在这种情况下,每个闭包捕获不同的 i 值,从而产生输出:

4 3 2 1 0
登录后复制

结论

第 2 部分和第 3 部分之间的主要区别在于第 2 部分捕获 i可变,而第 3 部分则不然。这会影响闭包执行时的行为,导致不同的输出。

以上是Go闭包中如何延迟捕获参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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