延迟和关闭:捕获变量的行为是什么?

问题描述 投票:0回答:1

请参阅以下代码(也可在 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 closures defer-keyword
1个回答
0
投票

自 go 1.22 以来,for 循环行为发生了变化。看看这个

© www.soinside.com 2019 - 2024. All rights reserved.