gpt4 book ai didi

go - 新运行的 for 循环是否结束上次运行的 for 循环的范围?

转载 作者:IT王子 更新时间:2023-10-29 02:04:04 26 4
gpt4 key购买 nike

我不明白为什么下面的程序打印0 1 2。我认为它会打印 2 2 2

package main

import (
"fmt"
)

func main() {
var funcs []func()
for i := 0; i < 3; i++ {
idx := i
funcs = append(funcs, func() { fmt.Println(idx) })
}

for _, f := range funcs {
f()
}
}

我的理由是它应该打印 2 2 2 是 for 循环的每次运行共享相同的范围(例如,for 循环的第二次运行不会终止第一次运行的范围,范围共享)。因此 idx 的引用由在每次 for 循环运行中创建的匿名函数共享。因此,当循环结束时,创建的所有 3 个函数共享相同的 idx 引用,其值为 2。

所以我认为问题归结为:for 循环的新运行(例如,i == 2)是否结束 for 循环的上次运行(例如,i == 1)的范围?如果答案将我指向 golang 规范,我将不胜感激。 (我找不到提到这个的规范)。

最佳答案

来自规范 https://golang.org/ref/spec#For_statements

A "for" statement specifies repeated execution of a block.

这些 block 中的每一个都有自己的范围,它们不是嵌套或共享的。但是

Each "if", "for", and "switch" statement is considered to be in its own implicit block.

因此您代码段中的变量 i 是共享的并且

for i := 0; i < 3; i++ {
funcs = append(funcs, func() { fmt.Println(i) })
}

for _, f := range funcs {
f()
}

将按预期打印 3 3 3。

关于go - 新运行的 for 循环是否结束上次运行的 for 循环的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259996/

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