【发布时间】:2020-12-18 03:23:32
【问题描述】:
我的程序通常使用控制终端来读取用户的输入。
// 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.Scan() 和s.Text() 读取输入。效果不错。
但是,为了进行测试,我将 stdin 上的以下输入模拟到我的 CLI Go-Program
echo -e "yes\nno\nyes\n" | app
这将无法正常工作,因为s 和s.Scan() 的第一个构造将已经缓冲其他测试输入,bufio.NewScanner 和后续扫描将无法用于新构造.
我想知道如何确保s *bufio.Scanner 从标准输入流中只读取一行,或者如何模拟我对控制终端的输入。
我有几个猜测,但我不确定它们是否有效:
- 在整个程序中只使用一个
bufio.Scanner是一种解决方案,但我不想这样...... - 用
s.WriteTo(GetCtty())(?) 将缓冲的数据写回GetCtty()(?)想要工作,因为这些东西被附加而不是预先在标准输入上? - 不知何故只读取一行而不消耗更多字节,这是否意味着不按块读取而是逐字节读取(?)...
【问题讨论】: