【问题标题】:Simulating continuous inputs on stdin and scanning lines模拟标准输入和扫描线上的连续输入
【发布时间】: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

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

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

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

  • 在整个程序中只使用一个bufio.Scanner 是一种解决方案,但我不想这样......
  • s.WriteTo(GetCtty()) (?) 将缓冲的数据写回GetCtty()(?)想要工作,因为这些东西被附加而不是预先在标准输入上?
  • 不知何故只读取一行而不消耗更多字节,这是否意味着不按块读取而是逐字节读取(?)...

【问题讨论】:

    标签: go stdin tty


    【解决方案1】:

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

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

    【讨论】:

    • 哈哈太好了,太棒了……而且它甚至应该用于测试。
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2023-01-30
    相关资源
    最近更新 更多