首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >突破input.Scan()

突破input.Scan()
EN

Stack Overflow用户
提问于 2015-12-27 13:51:58
回答 5查看 11.5K关注 0票数 22

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

代码语言:javascript
运行
复制
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,从而脱离循环。

扫描会将扫描程序推进到下一个令牌,然后通过Bytes或Text方法提供该标记。当扫描停止时,它会返回false,要么通过到达输入的末尾,要么返回错误。当扫描返回false后,Err方法将返回扫描过程中发生的任何错误,除非它是io.EOF,Err将返回零。如果拆分函数返回100个空令牌而不推进输入,则扫描恐慌。这是扫描仪常见的错误模式。

我是否误解了这些文件,而且实际上有必要有这样一个if-子句来解释?(我使用Go 1.5.2使用"go run“运行程序。)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-12-27 15:27:01

我想你看错文件了。默认的扫描器是ScanLines函数。

文件上说:

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

这里有两个要点:

  • 返回行可能是空的:它意味着返回空行。
  • 即使没有换行符,也会返回最后一个非空的输入行:这意味着如果文件是非空的,则始终返回文件的最后一行。但是,这并不意味着流的末尾是空行。

扫描仪将停止在EOF (文件的结尾)。例如,输入Ctrl将发送文件的末尾并停止扫描程序。

票数 40
EN

Stack Overflow用户

发布于 2015-12-27 15:32:52

输入空白的新行不会自动停止扫描程序。

如果它没有坏,就不要修理它--但你可以让它按你的要求行事。这并不能消除您的if块,但功能如您所期望的那样,即在没有输入的情况下按enter将停止扫描程序:

代码语言:javascript
运行
复制
    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())
    }
票数 8
EN

Stack Overflow用户

发布于 2019-04-22 17:40:41

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34481065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档