涉及到不同的输出终端,自然涉及到一个问题:缓冲。
在C语言中基于流的 I/O 提供了 3 种缓冲:
直到缓冲区被填满,才调用系统 I/O 函数。
磁盘文件通常是全缓冲的。
直到遇到换行符 ‘\n
’,才调用系统 I/O 库函数。
\n
’ 才进行 I/O 操作,将所读内容读入缓冲区\n
’ 才进行 I/O 操作,将缓冲区内容写到外存中由于缓冲区的大小是有限的,所以当缓冲区被填满时,即使没有遇到换行符‘\n
’,也同样会进行实际的 I/O 操作。
标准输入 stdin
和标准输出 stdout
默认都是行缓冲的。
没有缓冲区,数据会立即读入或者输出到外存文件和设备上。
标准错误 stderr
是无缓冲的,这样保证错误提示和输出能够及时反馈给用户,供用户排除错误。
官方回答,go中os.Stdin
,os.Stdout
和os.Stderr
都是无缓冲的,因为它的类型实际上是 *os.File
,很显然 *os.File
是无缓冲的。
Go 中如果需要缓冲,请使用 bufio
包,特殊的需求,可以基于它进行扩展。