我有一个简单的代码来读取来自控制台的所有输入:
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“运行程序。)
发布于 2015-12-27 15:27:01
我想你看错文件了。默认的扫描器是ScanLines函数。
文件上说:
ScanLines是扫描器的一个拆分函数,它返回每一行文本,去掉任何行尾标记。返回的行可能为空。行尾标记是一个可选的回车,然后是一个强制换行符.在正则表达式表示法中,它是
\r?\n。即使没有换行符,也会返回最后一个非空的输入行。
这里有两个要点:
扫描仪将停止在EOF (文件的结尾)。例如,输入Ctrl将发送文件的末尾并停止扫描程序。
发布于 2015-12-27 15:32:52
输入空白的新行不会自动停止扫描程序。
如果它没有坏,就不要修理它--但你可以让它按你的要求行事。这并不能消除您的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())
}发布于 2019-04-22 17:40:41
CTRL+D中断,如果您想轻松地输入数据,可以使用cat input.txt | go run script.go或go run script.go < input.txt。
https://stackoverflow.com/questions/34481065
复制相似问题