下面这一段程序是我手误多写了一个 冒号, 结果输出的时候是无限死循环输出 1
但是想问下为什么会一直输出1,而且为什么 := 这种赋值方式在第二次赋值的时候不报错
func main(){
s := []int{1}
for len(s) > 0 {
s1 := s[0]
//这里多写了一个冒号,程序变成死循环
//如果这里写 s = s[1:] 就会正常执行,第四次跳出循环
s := s[1:]
if (s1 == 4) {
break
}
fmt.Println(s1)
s = append(s, 2, 3, 4)
time.Sleep(time.Millisecond*2000)
}
}
:=
是声明一个新变量并赋初值。s:=s[1:]
就声明了一个新变量,其后对s
的操作也是针对这个新声明的变量,并没有改变 for 判断条件里的s
,所以len(s) > 0
一直成立,于是死循环。至于为啥不报错,因为第二次
:=
是在一个新的作用域,不是在同一个作用域里的重复定义。在定义新变量后,再其作用域里(声明之后,for 循环体内部),s
是这个新声明的变量。for 循环之后,s
还是原来的那个s
。