【问题标题】:Break out of input.Scan()突破 input.Scan()
【发布时间】:2016-04-01 13:37:19
【问题描述】:

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

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 并因此跳出循环。

Scan 将 Scanner 推进到下一个令牌,然后可以通过 Bytes 或 Text 方法获得该令牌。当扫描停止时,它返回 false,无论是到达输入的末尾还是错误。 Scan 返回 false 后,Err 方法将返回扫描过程中发生的任何错误,除非是 io.EOF,否则 Err 将返回 nil。如果 split 函数在没有推进输入的情况下返回 100 个空标记,则扫描恐慌。这是扫描仪的常见错误模式。

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

【问题讨论】:

  • 我想做的是摆脱 if 子句为什么这是个问题?
  • 如果我删除 if 子句,然后按 Return,程序不会离开循环。在控制台上,它只是让我进入下一行。循环后的代码没有被执行。

标签: go


【解决方案1】:

我认为您误读了文档。默认扫描仪是 ScanLines 函数。

文档说:

ScanLines 是 Scanner 的一个拆分函数,它返回每一行 文本,去掉任何尾随的行尾标记。返回的线路 可能是空的。行尾标记是一个可选的回车符 后跟一个强制性换行符。在正则表达式表示法中,它 是\r?\n。将返回最后一个非空输入行,即使 它没有换行符。

这里有两个重点:

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

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

【讨论】:

  • 在 windows 上使用 Ctrl-Z。
【解决方案2】:

键入一个空白的新行不会自动停止扫描仪。

如果它没有损坏,请不要修复它——但你可以让它按照你的需要运行。这并没有摆脱您的 if 块,但功能与您期望的扫描仪一样,即在没有输入的情况下按 Enter 将停止扫描仪:

    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())
    }

【讨论】:

  • @Chris 我在发布我的之前看到了 Mickaël Rémond 在技术上准确的答案,所以我决定专注于简单地让代码按照您的意愿执行。感谢您的支持;)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您没有误解文档。

    扫描停止时返回 false,到达输入的末尾或错误。

    文档中的说明是正确的。但是您缺少一种方法来提供输入的结尾,即来自控制台的 EOF。

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

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

    【讨论】:

      【解决方案5】:

      对于Mac系统,你可以尝试Ctrl + D默认破解。如果您排在最后,则必须点击Ctrl + D 2 次​​strong>。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2013-03-06
        • 2014-05-31
        • 2017-03-13
        • 2012-03-02
        • 1970-01-01
        相关资源
        最近更新 更多