我有以下程序。
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)
}
我将收到错误“左侧没有新变量:=
”。为什么这个?
这里有几件事。首先,让我们解决您问题的下半部分。
声明变量的默认方法是使用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
在该范围内不存在。
问题内容: 通过测试我发现 这是不合法的: 但这是: 为什么? 问题答案: 第一种方法不合法,因为编译器很明显不能使用在那里声明的声明,因为在该循环中不能再包含其他语句。基本上,该位置的新变量声明将超出下一个语句的范围,因此没有任何用处。 在第二种情况下,循环后跟花括号,这创建了一个新的作用域,您可以使用该变量。
如下所示,我要反转数组。但我的代码不管用。这是我的for循环。请看一下。这个for循环正确吗。代码如下。
在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接
在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接
在循环中,我是否可以对循环使用相同的计数器变量? 或者这些变量会相互影响吗?以下代码应该为第二个循环使用不同的变量,例如,还是可以?
我可以打印最大罚款,但我不能打印计数。我看不出max和count之间的区别,也看不出为什么它不让我打印count。感谢任何帮助