登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-17 13:27:29 127浏览 收藏

本篇文章探讨了如何模拟标准输入,以便在测试期间为程序提供连续的输入。作者目前使用控制终端读取用户输入,但希望在测试时模拟标准输入上的输入。他们考虑了几种可能的解决方案,包括仅使用一个扫描仪、将缓冲数据写回控制终端,以及按字节而不是按块读取输入。最终,作者采用了一种解决方案,使用 iotest.OneByteReader 禁用扫描仪中的缓冲,以确保扫描仪每次仅读取一行输入。

问题内容

我的程序通常使用控制终端来读取用户的输入。

// 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() 读取输入。效果很好。

但是,为了进行测试,我正在将标准输入上的以下输入模拟到我的 cli go 程序

echo -e "yes\nno\nyes\n" | app

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

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

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

  • 在整个程序中仅使用一个 bufio.scanner 是一种解决方案,但我不想走这条路......
  • 使用 s.writeto(getctty()) (?) 将缓冲数据写回 getctty() (?) 想要将内容附加到标准输入上而不是放在前面吗?
  • 不知何故只读取一行并且不消耗更多字节,这是否意味着不是按块读取而是按字节读取(?)...

解决方案


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

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

今天关于《模拟标准输入和扫描线上的连续输入》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>