猿问

突破 input.Scan()

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


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 并因此跳出循环。


Scan 将 Scanner 推进到下一个令牌,然后可以通过 Bytes 或 Text 方法获得该令牌。当扫描停止时,它返回 false,无论是到达输入的末尾还是错误。Scan 返回 false 后,Err 方法将返回扫描过程中发生的任何错误,除非是io.EOF,Err 将返回 nil。如果 split 函数返回 100 个空标记而不推进输入,则扫描恐慌。这是扫描仪的常见错误模式。


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


子衿沉夜
浏览 262回答 3
3回答

收到一只叮咚

我认为您误读了文档。默认扫描仪是 ScanLines 功能。文档说:ScanLines 是 Scanner 的拆分函数,它返回每行文本,去除任何尾随的行尾标记。返回的行可能为空。行尾标记是一个可选的回车符,后跟一个强制换行符。在正则表达式中,它是\r?\n. 即使没有换行符,也将返回最后一个非空行的输入。这里有两个重要的点:返回行可能为空:这意味着它返回空行。即使没有换行符,也将返回输入的最后一行非空行:这意味着如果文件非空,则始终返回文件的最后一行。然而,这并不意味着一个空行结束了流。扫描仪将在 EOF(文件结束)处停止。例如,键入 Ctrl-D 将发送文件结尾并停止扫描仪。

函数式编程

键入一个空白的新行不会自动停止扫描仪。如果它没有坏,就不要修理它——但你可以让它按照你的要求运行。这不会消除您的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())    }

Qyouu

CTRL+D打破,如果你想轻松输入数据,你可以使用cat input.txt | go run script.go或go run script.go < input.txt。
随时随地看视频慕课网APP

相关分类

Go
我要回答