gpt4 book ai didi

go - golang的 "defer"怎么捕获闭包的参数?

转载 作者:IT老高 更新时间:2023-10-28 13:00:26 43 4
gpt4 key购买 nike

这是我的代码 (run):

package main

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
}

输出:

0
1
2
3
4
4
3
2
1
0
4
4
4
4
4

问题:第 2 部分和第 3 部分有什么区别?为什么第 2 部分输出“44444”而不是“43210”?

最佳答案

“第 2 部分”闭包捕获变量“i”。当闭包中的代码(稍后)执行时,变量“i”具有它在 range 语句的最后一次迭代中具有的值,即。 '4'。因此

4 4 4 4 4

部分输出。

“第 3 部分”在其闭包中不捕获任何外部变量。作为specs说:

Each time the "defer" statement executes, the function value and parameters to the call are evaluated as usual and saved anew but the actual function is not invoked.

所以每个延迟函数调用都有不同的 'n' 参数值。它是执行 defer 语句时“i”变量的值。因此

4 3 2 1 0

部分输出,因为:

... deferred calls are executed in LIFO order immediately before the surrounding function returns ...


需要注意的关键点是defer语句执行时'defer f()'中的'f()'没有执行

但是

“defer f(e)”中的表达式“e”在 defer 语句执行时被计算

关于go - golang的 "defer"怎么捕获闭包的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16010694/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com