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

我有以下程序。


package main


import (

    "fmt"

)


func main() {

    for i := 0; i < 2; i++ {

        x := 77

        fmt.Println(x)

    }

}

执行时我得到:


77

77

正如我们所见,x := 77已经执行了 2 次。但是,如果我像这样稍微修改它:


package main


import (

    "fmt"

)


func main() {

    a := 77

    fmt.Println(a)

    a := 77

    fmt.Println(a)

}

我会收到错误“左侧没有新变量:=”。为什么这个?


陪伴而非守候
浏览 421回答 2
2回答

MMMHUHU

这里有几件事。首先让我们解决你问题的后半部分。声明变量的默认方法是使用var关键字,然后使用=运算符对其进行赋值。var a inta = 77Go 为我们提供了一个快捷方式:=,既可以声明一个变量,也可以分配一个值a := 77在您的示例中,当您:=第二次使用时,您试图重新声明一个a在同一范围内命名的新变量,这是不允许的。该错误no new variables on left side of :=试图告诉您这一点。但是现在对于您最初的问题,为什么您可以在 for 循环中多次执行此操作?原因是每次输入花括号块时,{}您都在创建一个新的嵌套范围。当您x在循环顶部声明变量时,它是一个新变量,并且在循环结束时超出范围。当程序再次回到循环顶部时,它是另一个新范围。例如看这段代码{&nbsp; &nbsp; x := 77&nbsp; &nbsp; fmt.Println(x)}fmt.Println(x) // Compile error第二个Println失败,因为x该范围内不存在。

胡说叔叔

一个标识符不能在同一个块中声明两次,也不能在文件块和包块中都声明标识符。每次运行for这里都有新变量,此代码通过打印x (The Go Playground)的地址来显示它:package mainimport (&nbsp; &nbsp; "fmt")func main() {&nbsp; &nbsp; for i := 0; i < 2; i++ {&nbsp; &nbsp; &nbsp; &nbsp; x := 77&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(&x)&nbsp; &nbsp; }}输出:0x1040e0f80x1040e0fc如果您在第二个示例中需要新变量,您可以隐藏它(The Go Playground):package mainimport (&nbsp; &nbsp; "fmt")func main() {&nbsp; &nbsp; a := 77&nbsp; &nbsp; fmt.Println(&a)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; a := 77&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(&a)&nbsp; &nbsp; }}输出:0x1040e0f80x1040e0fc
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python