Go 当在for循环内创建新变量时,多变量短重声明?

Go 当在for循环内创建新变量时,多变量短重声明?,go,Go,各国: 因此,重新声明只能出现在多变量短声明中重新声明不会引入新变量;它只是将一个新值赋给原始值 但这在for循环中是如何工作的呢。似乎变量“nextPos”的作用域在循环外部,实际上在循环内部为内部作用域重新声明,从而在每次迭代中释放其值。不过,这个版本可以工作。这就是简短的赋值语句:=的工作原理。根据规范: 与常规变量声明不同,短变量声明可能 重新声明变量,前提是这些变量最初是在 同一块(如果该块是函数,则列出参数 主体)具有相同的类型,并且至少有一个非空变量 这是新的。因此,重新声明只能出

各国:

因此,重新声明只能出现在多变量短声明中重新声明不会引入新变量;它只是将一个新值赋给原始值


但这在for循环中是如何工作的呢。似乎变量“nextPos”的作用域在循环外部,实际上在循环内部为内部作用域重新声明,从而在每次迭代中释放其值。不过,这个版本可以工作。

这就是简短的赋值语句
:=
的工作原理。根据规范:

与常规变量声明不同,短变量声明可能 重新声明变量,前提是这些变量最初是在 同一块(如果该块是函数,则列出参数 主体)具有相同的类型,并且至少有一个非空变量 这是新的。因此,重新声明只能出现在 多变量短声明。重新声明不会引入 新变量;它只是将一个新值赋给原始值

因此,在您的第一个示例中,您可以看到有一个新变量,即
nextB
,该变量也为每个循环迭代重新声明
nextPos


在第二种情况下,
nextB
nextPos
都已声明,因此不会重新声明。还请注意,您使用的是
=
,因为编译器出于同样的原因不允许使用
:=
,也就是说,没有声明新变量。

让我们通过以下代码示例演示它的工作原理:

让我们简化您的第一个示例,请参阅此工作示例代码(1):

输出:

100
0 0
100
因此
a
中的
a
a,b:=0,0
中被隐藏了,这
a
是一个新变量,
这称为变量范围和阴影,
您现在可以将其命名为
c
,以显示其工作原理(2):

输出与(1)相同:

让我们简化下一个示例代码(3):

输出:

0 0
1 1
1 1
所以这里的
a
b
是相同的内外循环

另请参见:
请参阅:

Go有块作用域(与Javascript不同)。当你声明一个变量时,它是在它的“周围块”中声明的。由于可以使用嵌套块,因此可以在内部块和外部块中以相同的名称声明变量。这就是所谓的阴影。
package main

import "fmt"

func main() {
    a := 100
    {
        fmt.Println(a) // 100
        c, b := 0, 0
        fmt.Println(c, b) // 0 0
    }
    fmt.Println(a) // 100
}
100
0 0
100
package main

import "fmt"

func main() {
    a := 0
    b := byte(0)
    {
        fmt.Println(a, b) // 0 0
        a, b = 1, byte(1)
        fmt.Println(a, b) // 1 1
    }
    fmt.Println(a, b) // 1 1
}
0 0
1 1
1 1