gpt4 book ai didi

go - 为什么以相反的顺序调用范围循环中的延迟?

转载 作者:IT王子 更新时间:2023-10-29 01:08:30 24 4
gpt4 key购买 nike

我遇到了一个 answer关于“反向范围”的问题,我打算对它投反对票,因为它看起来错得离谱但经过检查它确实有效(!):

https://play.golang.org/p/4K2fDlSoCm

package main

import (
"fmt"
)

func main() {
s := []int{1, 2, 3, 4, 5}
for i, _ := range s {
defer fmt.Println(s[i])
}
}

输出是:

5
4
3
2
1
Program exited.

知道为什么会这样吗?我说得对吗,不能保证完全按照相反的顺序执行?此外,我认为这不是编写程序的好方法,但我很想知道为什么我们会得到这个结果。

最佳答案

defer 是一个 LIFO 或堆栈 - 它保证以相反的顺序执行。它获取第一个 defer 并将其放入某个内部堆栈(可能,我不知道血淋淋的细节),然后将下一个 defer 放在那个之上,然后当它到达函数的末尾时,它从顶部开始展开。它似乎是在 for 循环中设计的(我知道这是 Go 的例子,不是你的),但在其他情况下,一个函数依赖于其他函数的清理,这更有意义为什么它应该是,因此是,保证是相反的执行顺序。

这是一个不同的例子,全是伪代码,但希望重点是清楚的。

open stream1
defer close stream1
defer write stream1 "stream2 better be closed, or we are in trouble..."
open stream2
defer close stream2
defer stream2 "this is the last you'll ever hear from stream2"

connect stream2 to stream1

write stream2 "hey, we are in stream2, this feeds into stream1"

应该打印如下内容:

"hey, we are in stream2, this feeds into stream1"
"this is the last you'll ever hear from stream2"
"stream2 better be closed, or we are in trouble..."

如果您不能保证反向排序,则无法确定 stream1 在您的 defer stream2 write 期间是否仍然打开。

关于go - 为什么以相反的顺序调用范围循环中的延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37073538/

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