在Golang中,为什么我可以在for循环中多次重新定义相同的变量但不能在循环之外?

Jus*_*ner 8 variables go

我有以下程序.

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 2; i++ {
        x := 77
        fmt.Println(x)
    }
}
Run Code Online (Sandbox Code Playgroud)

执行时,我得到:

77
77
Run Code Online (Sandbox Code Playgroud)

我们可以看到,x := 77已经执行了2次.但是,如果我稍微修改它:

package main

import (
    "fmt"
)

func main() {
    a := 77
    fmt.Println(a)
    a := 77
    fmt.Println(a)
}
Run Code Online (Sandbox Code Playgroud)

我将得到错误"左侧没有新变量:=".为什么这个?有人可以帮忙解释一下吗?提前致谢.

jcb*_*lkr 12

这里有几件事.首先让我们解决你问题的后半部分.

声明变量的默认方式是使用var关键字,然后使用=运算符分配给它.

var a int
a = 77
Run Code Online (Sandbox Code Playgroud)

Go允许我们使用快捷方式:=来声明变量并赋值

a := 77
Run Code Online (Sandbox Code Playgroud)

在您的示例中,当您:=第二次使用时,您尝试重新声明a在同一范围内命名的新变量,这是不允许的.错误no new variables on left side of :=是试图告诉你这个.

但是现在问到你原来的问题,为什么你能在for循环中多次这样做?

原因是每次进入花括号块时,{}您都在创建一个新的嵌套范围.当您x在循环顶部声明变量时,它是一个新变量,并且在循环结束时超出范围.当程序再次回到循环的顶部时,它是另一个新的范围.

例如,看看这段代码

{
    x := 77
    fmt.Println(x)
}
fmt.Println(x) // Compile error
Run Code Online (Sandbox Code Playgroud)

第二个Println失败,因为x在该范围内不存在.