golang for循环中,为什么这样写会是一个死循环

新手上路,请多包涵

下面这一段程序是我手误多写了一个 冒号, 结果输出的时候是无限死循环输出 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)
    }
}
阅读 2.9k
1 个回答

:= 是声明一个新变量并赋初值。s:=s[1:] 就声明了一个新变量,其后对 s 的操作也是针对这个新声明的变量,并没有改变 for 判断条件里的 s ,所以 len(s) > 0 一直成立,于是死循环。

至于为啥不报错,因为第二次 := 是在一个新的作用域,不是在同一个作用域里的重复定义。在定义新变量后,再其作用域里(声明之后,for 循环体内部),s 是这个新声明的变量。for 循环之后,s 还是原来的那个 s

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题