请参阅以下代码(也可在 https://go.dev/play/p/4Stz-kpCpoh 获取):
package main
import "fmt"
func main() {
var whatever [5]struct{}
// Test A
fmt.Print("Test A: ")
for i := range whatever {
fmt.Printf("%d ", i)
}
// Test B
for i := range whatever {
defer func() { fmt.Printf("%d ", i) }()
}
defer fmt.Print("\nTest B: ")
// Test C
for i := range whatever {
defer func(n int) { fmt.Printf("%d ", n) }(i)
}
defer fmt.Print("\nTest C: ")
}
下面是它的输出(由 Go 1.23 编译):
Test A: 0 1 2 3 4
Test C: 4 3 2 1 0
Test B: 4 3 2 1 0
我的问题是关于测试 B 的输出。由于在 for 循环结束时
i
的值是 4
,所以它的输出不应该是
Test B: 4 4 4 4 4
相反?
实际上,根据
this线程,它曾经是
4 4 4 4 4
(上面的代码与该讨论中的示例相同。我只是更改了输出格式)。
自 go 1.22 以来,for 循环行为发生了变化。看看这个。