模拟标准输入和扫描线上的连续输入
Simulating continuous inputs on stdin and scanning lines
我的程序通常使用控制终端来读取用户的输入。
// GetCtty gets the file descriptor of the controlling terminal.
func GetCtty() (*os.File, error) {
return os.OpenFile("/dev/tty", os.O_RDONLY, 0)
}
我目前在编程期间多次构建s := bufio.NewScanner(GetCtty())
,并使用s.Text()
读取来自s.Scan()
的输入。效果不错。
但是,为了进行测试,我在 stdin 上模拟以下输入到我的 CLI Go 程序中
echo -e "yes\nno\nyes\n" | app
这将无法正常工作,因为 s
和 s.Scan()
的第一个构造已经 缓冲了 其他测试输入,这些输入将无法用于bufio.NewScanner
和后续扫描的新构造。
我想知道如何确保 s *bufio.Scanner
从 stdin 流中只读取 一行 或者我如何模拟我对控制终端的输入.
我有几个猜测,但我不确定它们是否有效:
- 在整个程序中只使用一个
bufio.Scanner
是一种解决方案,但我不想这样做...
- 使用
s.WriteTo(GetCtty())
将缓冲数据写回 GetCtty()
(?) 想要工作,因为这些东西被附加而不是放在标准输入上?
- 不知何故只读取一行而不消耗更多字节,这是否意味着不以块为单位而是逐字节读取(?)...
使用iotest.OneByteReader禁用扫描仪中的缓冲:
s := bufio.NewScanner(iotest.OneByteReader(GetCtty()))
我的程序通常使用控制终端来读取用户的输入。
// GetCtty gets the file descriptor of the controlling terminal.
func GetCtty() (*os.File, error) {
return os.OpenFile("/dev/tty", os.O_RDONLY, 0)
}
我目前在编程期间多次构建s := bufio.NewScanner(GetCtty())
,并使用s.Text()
读取来自s.Scan()
的输入。效果不错。
但是,为了进行测试,我在 stdin 上模拟以下输入到我的 CLI Go 程序中
echo -e "yes\nno\nyes\n" | app
这将无法正常工作,因为 s
和 s.Scan()
的第一个构造已经 缓冲了 其他测试输入,这些输入将无法用于bufio.NewScanner
和后续扫描的新构造。
我想知道如何确保 s *bufio.Scanner
从 stdin 流中只读取 一行 或者我如何模拟我对控制终端的输入.
我有几个猜测,但我不确定它们是否有效:
- 在整个程序中只使用一个
bufio.Scanner
是一种解决方案,但我不想这样做... - 使用
s.WriteTo(GetCtty())
将缓冲数据写回GetCtty()
(?) 想要工作,因为这些东西被附加而不是放在标准输入上? - 不知何故只读取一行而不消耗更多字节,这是否意味着不以块为单位而是逐字节读取(?)...
使用iotest.OneByteReader禁用扫描仪中的缓冲:
s := bufio.NewScanner(iotest.OneByteReader(GetCtty()))