打破输入.Scan()

Chr*_*ris 16 go

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

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())
}
Run Code Online (Sandbox Code Playgroud)

代码是有效的.我想要做的是摆脱if子句.在我对文档的理解中,如果一行是空的,input.Scan()则返回false,因此会脱离循环.

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

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

Mic*_*ond 25

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

文件说:

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

这里有两个要点:

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

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

  • 在Windows上,使用Ctrl-Z。 (2认同)

Sno*_*man 6

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

如果它没有坏,就不要修理它——但你可以让它按照你的要求运行。这不会消除您的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())
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

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