如何结束控制台中的`scanner.Scan`循环以获取golang?

Kev*_*vin 0 go

我有两行(或可能更多)输入行,我希望程序接受。例如。

1 2 3 4
5 6 7 8
Run Code Online (Sandbox Code Playgroud)

根据官方文件,

for scanner.Scan() {
}
Run Code Online (Sandbox Code Playgroud)

会导致对无限行进行扫描,直到达到EOF或错误为止,是否还有其他函数会接受两行输入呢?

Gur*_* GV 8

要求用户按“CTRL + D”,从终端发出 EOF 信号,你上面的代码应该没有任何变化。

  • 在 Windows 10 cmd 提示符下失败 (2认同)
  • 我一直在寻找的答案。@阿玛 (2认同)

pet*_*rSO 6

传统上,最终用户从标准输入中输入空行(零长度)。例如,

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)

func main() {
    snr := bufio.NewScanner(os.Stdin)
    enter := "Enter a line of data:"
    for fmt.Println(enter); snr.Scan(); fmt.Println(enter) {
        line := snr.Text()
        if len(line) == 0 {
            break
        }
        fields := strings.Fields(line)
        fmt.Printf("Fields: %q\n", fields)
    }
    if err := snr.Err(); err != nil {
        if err != io.EOF {
            fmt.Fprintln(os.Stderr, err)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ go run data.go
Enter a line of data:
1 2 3 4
Fields: ["1" "2" "3" "4"]
Enter a line of data:
5 6 7 8
Fields: ["5" "6" "7" "8"]
Enter a line of data:

$
Run Code Online (Sandbox Code Playgroud)

  • 这非常清楚,并且在从文件传输 Stdin 的上下文中帮助了我。我想知道这个上下文,请求用户输入,这会导致扫描命中“EOF”吗?我想这是最安全的方法,因为即使它从未发生,处理它也没有什么坏处? (2认同)