如何在控制台中结束Golang的`scanner.Scan`循环?

5

我有两行(或更多)输入,希望程序能够接受。例如:

1 2 3 4
5 6 7 8

According to the official doc, using

for scanner.Scan() {
}

如果使用这种方法,程序将会扫描无限行,直到遇到文件结束或错误。是否有其他函数可以只读取两行输入?


你不能在两行后跳出循环吗? - kichik
如果我想要超过两行怎么办? - Kevin
@Kevin 你想要使用计数器并在需要时中断吗? - OneOfOne
我不确定你在这里问什么。使用相同的方法,您可以在任意数量的行后中断。 - kichik
如果我不知道用户输入了多少行,我该如何使用计数器? - Kevin
显示剩余2条评论
4个回答

17

在从标准输入(stdin)接收用户输入时,通常习惯以一个空行(长度为零)作为结束标志。例如:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)

func main() {
    snr := bufio.NewScanner(os.Stdin)
    enter := "Enter a line of data:"
    for fmt.Println(enter); snr.Scan(); fmt.Println(enter) {
        line := snr.Text()
        if len(line) == 0 {
            break
        }
        fields := strings.Fields(line)
        fmt.Printf("Fields: %q\n", fields)
    }
    if err := snr.Err(); err != nil {
        if err != io.EOF {
            fmt.Fprintln(os.Stderr, err)
        }
    }
}

输出:

$ go run data.go
Enter a line of data:
1 2 3 4
Fields: ["1" "2" "3" "4"]
Enter a line of data:
5 6 7 8
Fields: ["5" "6" "7" "8"]
Enter a line of data:

$

2
这真的很清晰,帮助我在从文件中传输Stdin的上下文中。不过我对于请求用户输入的情况有些疑问,会不会导致扫描命中“EOF”?我想这是安全的做法,即使它永远不会发生,处理它也没有任何伤害。 - Davos

11

要求用户按下“CTRL + D”键以从终端发送EOF信号,您的以上代码应该不需要任何更改即可正常工作。


2
在Windows 10命令提示符中失败 - amarVashishth
2
我正在寻找的答案。@ama - ervinbosenbacher

-1
一种实现此功能的方法是验证扫描器是否已经到达文件末尾。
var s scanner.Scanner

   file, _ := os.Open("file.go") // return io.Reader

   s.Init(file) // needs io.Reader

   var character rune
   character = s.Scan()

   for character != scanner.EOF {
    // here your code
   }

-3

使用 ctl+z 结束 scanner.Scan()


答案应该是以编程方式实现的。 - Randomize
1
这会将它放在后台,而不是结束它。请勿这样做。 - Guruprasad GV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接