为了账号安全,请及时绑定邮箱和手机立即绑定

突破 input.Scan()

突破 input.Scan()

Go
子衿沉夜 2021-11-29 19:28:13
我有这个简单的代码来读取来自控制台的所有输入:input := bufio.NewScanner(os.Stdin) //Creating a Scanner that will read the input from the consolefor 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”运行程序。)
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

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

文档说:

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

这里有两个重要的点:

  • 返回行可能为空:这意味着它返回空行。

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

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


查看完整回答
反对 回复 2021-11-29
?
函数式编程

TA贡献1807条经验 获得超9个赞

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


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

    }


查看完整回答
反对 回复 2021-11-29
?
Qyouu

TA贡献1786条经验 获得超11个赞

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


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信