在EOF之前是否有类似于getchar()的Go函数?

时间:2014-11-07 23:10:33

标签: go getchar

我是Go的新手。我知道它有一些扫描功能:scan,sscan,scanf,sscanf等。

但是所有这些,我引用:“存储连续的空格分隔值”,有些人将新行视为空格。但这不是我需要的。

我已经尝试过了:

reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
fmt.Printf("Input Char Is : %v", string([]byte(input)[0]))

但是在新行不是EOF之后停止。

我需要一种方法一次一个地扫描单个字符,直到EOF。 在C中我会写:

while (getChar()){
//do stuff 
}

Go中与此相同的是什么?

1 个答案:

答案 0 :(得分:4)

想到两种技巧:

1。 ioutil.ReadAll

来自文档:

  

ReadAll从r读取,直到出现错误或EOF并返回它读取的数据。成功的调用返回err == nil,而不是err == EOF。因为ReadAll被定义为从src读取直到EOF,所以它不会将来自Read的EOF视为要报告的错误。

例如:

byteSlice, err := ioutil.ReadAll(os.Stdin)
if err != nil {
    log.Fatal(err)
}

for b := range byteSlice {
    // do stuff
}

这不应该用于io.Reader以外的任何文件(例如网络连接),因为EOF条件可能永远不会发生,因此程序可能永远阻止。

在你的情况下,可以使用这种技术,特别是如果你不介意将所有字节保存在内存中。

2。 io.ByteReader

另一种方法是通过io.ByteReader使用bufio.Reader界面,如下所示:

reader := bufio.NewReader(os.Stdin)
for {
    b, err := reader.ReadByte()
    if err != nil {
        break
    }

    // do stuff
}

这是最接近C的getchar()循环。