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
添加回答
举报