Go 如何从stdin中读取字节?

Go 如何从stdin中读取字节?,go,byte,buffer,stdin,Go,Byte,Buffer,Stdin,我想从stdin流中读取字节。与Read方法不同,ReadByte似乎不返回io.EOF。如果已读取所有字节,如何中断?这不是实现的问题,也不是实现的问题 请参见此示例以证明这一点: in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout) for { c, err := in.ReadByte() if err == io.EOF { break } out.WriteByt

我想从stdin流中读取字节。与
Read
方法不同,
ReadByte
似乎不返回
io.EOF
。如果已读取所有字节,如何中断?

这不是实现的问题,也不是实现的问题

请参见此示例以证明这一点:

in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout)
for {
    c, err := in.ReadByte()
    if err == io.EOF {
        break
    }
    out.WriteByte(c)
}
Hello World!
运行时,将打印上述内容

buf := bytes.NewBufferString("Hello World!\n")
in := bufio.NewReader(buf)
for {
    c, err := in.ReadByte()
    if err == io.EOF {
        break
    }
    fmt.Print(string(c))
}
并正确终止

您的问题在于
os.Stdin
。从中阅读是特定于其来源的。如果它是您的终端,从它读取只是阻塞,而不报告
io.EOF
。请参见此示例以证明这一点:

in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout)
for {
    c, err := in.ReadByte()
    if err == io.EOF {
        break
    }
    out.WriteByte(c)
}
Hello World!
其产出是:

in := bufio.NewReader(os.Stdin)
for {
    fmt.Println("Reading.")
    c, err := in.ReadByte()
    if err == io.EOF {
        break
    }
    fmt.Print(string(c))
}
什么也没发生。没有新的迭代,它被阻止了。现在,如果您输入一行并按enter键,例如,您输入
Go,输出将为:

Reading.
然后再次等待新的输入。如您所见,每条线路都提供数据。这就是终端的功能:当您输入线路时,它不会发送到
os.Stdin
。按Enter键后,整行输入,可从
os.Stdin
获得。这就是我们看到的:输入的每个字母
Go和换行符。我们可以看到每次迭代打印的
文本。消耗输入后,
in.ReadByte()
再次被阻止,等待新的输入。它不报告
io.EOF

现在尝试以下操作:创建一个文件,例如
a.txt
,并将其编辑成一行:
Go和换行符。现在将此文件作为标准输入输入到程序:

Go!
GReading.
oReading.
!Reading.

Reading.

它终止了,所以它工作了!它之所以有效,是因为这次
os.Stdin
的源不是您的控制台/终端,而是文件的内容,一旦文件被使用,尝试从
os.Stdin
读取将正确报告
io.EOF

ReadByte读取并返回单个字节。如果没有可用的字节,则返回一个错误。
read直到出现错误,然后break。所以
如果出错!=无{…