我有这个简单的代码来从控制台读取所有输入:
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,因此会脱离循环。
扫描将扫描仪推进到下一个令牌,然后可通过字节或文本方法使用该令牌。扫描停止时返回false,或者到达输入结束或出错。在Scan返回false之后,Err方法将返回扫描期间发生的任何错误,除非它是
io.EOF
,Err将返回nil。如果拆分功能返回100个空标记而不提前输入,则扫描恐慌。这是扫描仪的常见错误模式。
我是否误解了文档,实际上有必要让这样的if子句突破? (我正在使用Go 1.5.2使用“go run”运行程序。)
答案 0 :(得分:22)
我认为你误读了文档。默认扫描程序是ScanLines函数。
文档说:
ScanLines是一个分离函数,用于返回每行的扫描仪 文本,剥离任何尾随行尾标记。返回的行 可能是空的。行尾标记是一个可选的回车符 然后是一个强制换行。在正则表达式表示法中,它 是
c:\users\Adi\black.png
。即使是,也会返回最后一个非空输入行 它没有新行。
这里有两个要点:
扫描仪将在EOF(文件结束)上停止。例如,键入Ctrl-D将发送文件结束并停止扫描仪。
答案 1 :(得分:4)
键入空行新行不会自动停止扫描程序。
如果它没有损坏,请不要修复它 - 但你可以按照你的要求使其运行。这并没有摆脱你的if
阻止,但功能正如你所期望的那样扫描,即在没有输入的情况下击中输入将停止扫描器:
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())
}
答案 2 :(得分:1)
CTRL+D
打破,
如果要轻松输入数据,可以使用cat input.txt | go run script.go
或go run script.go < input.txt
。
答案 3 :(得分:0)
您不会误解文档。
当扫描停止时,返回
,直到到达输入的结尾,否则返回错误。
什么文档说明是正确的。但是您想念的是,您需要一种方法来提供输入的结尾,即从控制台提供EOF。
在Linux中,您可以按“ CTRL + D”,这从终端发出EOF信号。
尽管这里有一个小问题,但是“ CTRL + D”仅在行的开头起作用。因此,要终止来自终端的输入,您需要转到新行并按“ CTRL + D”作为该行的第一个输入。
答案 4 :(得分:0)
对于Mac系统,您可以尝试Ctrl + D
使其默认断开。如果您在该行的末尾,则必须打Ctrl + D
2次。