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

时间:2016-03-25 05:19:24

标签: go

我希望程序可以使用两行(或更多行)输入。例如

1 2 3 4
5 6 7 8

根据官方文件,使用

for scanner.Scan() {
}

会导致无限行被扫描,直到达到EOF或错误,还有其他函数需要两行输入吗?

4 个答案:

答案 0 :(得分:3)

传统的最终用户输入来自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:

$

答案 1 :(得分:1)

要求用户按下“CTRL + D”,表示终端的EOF,上面的代码应该没有任何变化。

答案 2 :(得分:0)

执行此操作的一种方法是验证扫描仪是否已到达文件末尾。

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 :(得分:0)

使用ctl + z结束扫描程序。Scan()