模拟标准输入和扫描线上的连续输入

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

这将无法正常工作,因为 ss.Scan() 的第一个构造已经 缓冲了 其他测试输入,这些输入将无法用于bufio.NewScanner 和后续扫描的新构造。

我想知道如何确保 s *bufio.Scanner 从 stdin 流中只读取 一行 或者我如何模拟我对控制终端的输入.

我有几个猜测,但我不确定它们是否有效:

使用iotest.OneByteReader禁用扫描仪中的缓冲:

s := bufio.NewScanner(iotest.OneByteReader(GetCtty()))