亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我可以在 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 關注
  • 405 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號