在我的Go代码中,为什么外部for循环运行两次

在我的Go代码中,为什么外部for循环运行两次,go,Go,为什么这段代码要运行两次外部for循环 这是我的密码: package main import "fmt" func main() { loops := 1 for loops > 0 { fmt.Printf("\nNo of loops\n") fmt.Scanf("%d", &loops) for i := 0; i < loops; i++

为什么这段代码要运行两次外部for循环

这是我的密码:

package main

import "fmt"

func main() {
    loops := 1
    for loops > 0 {
        fmt.Printf("\nNo of loops\n")
        fmt.Scanf("%d", &loops)
        for i := 0; i < loops; i++ {
            fmt.Printf("%d ", i)
        }
    }

}
好吧,如果你看一下文档中的 上面说

Scan、Fscan、SSC可以将输入中的换行符视为空格

我已经尝试了下面的代码

package main

import "fmt"

func main() {
    loops := 1
    for loops > 0 {
        fmt.Printf("\nNo of loops\n")
        temp := 1
        fmt.Scanf("%d %d", &loops, &temp)
        fmt.Println("Temp:", temp)
        for i := 0; i < loops; i++ {
            fmt.Printf("\ti: %d \n", i)
        }
    }

}
所以temp取出了新行,外部循环按预期执行

没有温度变量,流量就像

-> loops=1 
-> outer for 
-> scanf loops (as 1) 
-> inner for loop 
-> outer for 
-> scanning will be ignored. since buffer is present in Standard Input, i.e., new line.
-> inner for loop
也就是说,对于循环=1,我们看到了两个内部循环。这不仅适用于循环=1,而且对于循环的任何值,都将为循环提供2个内部值

您可以在代码中如上所述防止这种情况,也可以使用方法

Scanln与Scan类似,但在换行时停止扫描,并且在最后一项之后必须有换行或EOF

像这样的事情应该可以

fmt.Scanln(&loops)
-> loops=1 
-> outer for 
-> scanf loops (as 1) 
-> inner for loop 
-> outer for 
-> scanning will be ignored. since buffer is present in Standard Input, i.e., new line.
-> inner for loop
fmt.Scanln(&loops)