打破输入.Scan()

问题描述 投票:14回答:5

我有这个简单的代码来从控制台读取所有输入:

input := bufio.NewScanner(os.Stdin) //Creating a Scanner that will read the input from the console

for input.Scan() {
    if input.Text() == "end" { break } //Break out of input loop when the user types the word "end"
    fmt.Println(input.Text())
}

代码是有效的。我想要做的是摆脱if子句。在我对文档的理解中,如果一行是空的,那么input.Scan()应该返回false并因此打破循环。

扫描将扫描仪推进到下一个令牌,然后可通过字节或文本方法使用该令牌。扫描停止时返回false,或者到达输入结束或出错。在Scan返回false之后,Err方法将返回扫描期间发生的任何错误,除非它是io.EOF,Err将返回nil。如果拆分功能返回100个空标记而不提前输入,则扫描恐慌。这是扫描仪的常见错误模式。

我是否误解了文档,实际上有必要让这样的if子句突破? (我正在使用Go 1.5.2使用“go run”运行程序。)

go
5个回答
22
投票

我想你误解了文档。默认扫描仪是ScanLines功能。

文件说:

ScanLines是扫描仪的分割功能,它返回每行文本,去掉任何尾端行标记。返回的行可能为空。行尾标记是一个可选的回车符,后跟一个强制换行符。在正则表达式表示法中,它是\r?\n。即使没有换行,也会返回最后一个非空的输入行。

这里有两个要点:

  • 返回行可能为空:表示返回空行。
  • 即使没有换行,也会返回最后一个非空的输入行:这意味着如果文件的非最后一行,则总是返回该行。然而,这并不意味着空行结束了流。

扫描仪将在EOF(文件结束)上停止。例如,键入Ctrl-D将发送文件结束并停止扫描仪。


4
投票

键入空行新行不会自动停止扫描仪。

如果它没有损坏,请不要修复它 - 但你可以按照你的要求使它运行。这并没有摆脱你的if块,但功能正如你所期望的扫描仪,即没有输入击中输入将停止扫描仪:

    input := bufio.NewScanner(os.Stdin) //Creating a Scanner that will read the input from the console

    for input.Scan() {
        if input.Text() == "" {
            break
        } 
        fmt.Println(input.Text())
    }

2
投票

CTRL+D打破,如果你想轻松输入数据,你可以使用cat input.txt | go run script.gogo run script.go < input.txt


0
投票

您没有误解文档。

扫描停止时返回false,或者到达输入结束或出错。

哪些文档说明是正确的。但是你错过了你需要一种方法来提供输入的结束,即来自控制台的EOF。

在linux中你可以按“CTRL + D”,它从终端发出EOF信号。

虽然这里有一个小问题,但“CTRL + D”仅在该行的开头起作用。因此,要终止来自终端的输入,您需要转到一个新行并按“CTRL + D”作为该行的第一个输入。


0
投票

对于Mac系统,您可以尝试Ctrl + D默认中断。如果你在线的末尾,你将不得不击中Ctrl + D 2次。

© www.soinside.com 2019 - 2024. All rights reserved.