为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

陪伴而非守候 2022-03-07 15:51:24
我有以下程序。package mainimport (    "fmt")func main() {    for i := 0; i < 2; i++ {        x := 77        fmt.Println(x)    }}执行时我得到:7777正如我们所见,x := 77已经执行了 2 次。但是,如果我像这样稍微修改它:package mainimport (    "fmt")func main() {    a := 77    fmt.Println(a)    a := 77    fmt.Println(a)}我会收到错误“左侧没有新变量:=”。为什么这个?
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

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


声明变量的默认方法是使用var关键字,然后使用=运算符对其进行赋值。


var a int

a = 77

Go 为我们提供了一个快捷方式:=,既可以声明一个变量,也可以分配一个值


a := 77

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


但是现在对于您最初的问题,为什么您可以在 for 循环中多次执行此操作?


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


例如看这段代码


{

    x := 77

    fmt.Println(x)

}

fmt.Println(x) // Compile error

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


查看完整回答
反对 回复 2022-03-07
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

一个标识符不能在同一个块中声明两次,也不能在文件块和包块中都声明标识符。

每次运行for这里都有新变量,

此代码通过打印x (The Go Playground)的地址来显示它:


package main


import (

    "fmt"

)


func main() {

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

        x := 77

        fmt.Println(&x)

    }

}

输出:


0x1040e0f8

0x1040e0fc

如果您在第二个示例中需要新变量,您可以隐藏它(The Go Playground):


package main


import (

    "fmt"

)


func main() {

    a := 77

    fmt.Println(&a)

    {

        a := 77

        fmt.Println(&a)

    }

}

输出:


0x1040e0f8

0x1040e0fc


查看完整回答
反对 回复 2022-03-07
  • 2 回答
  • 0 关注
  • 420 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号