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