我是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中与此相同的是什么?
答案 0 :(得分:4)
想到两种技巧:
来自文档:
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条件可能永远不会发生,因此程序可能永远阻止。
在你的情况下,可以使用这种技术,特别是如果你不介意将所有字节保存在内存中。
另一种方法是通过io.ByteReader
使用bufio.Reader
界面,如下所示:
reader := bufio.NewReader(os.Stdin)
for {
b, err := reader.ReadByte()
if err != nil {
break
}
// do stuff
}
这是最接近C的getchar()
循环。