2 回答

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該范圍內不存在。

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
添加回答
舉報