如何退出reader.ReadString等待用户输入?

时间:2016-04-22 21:03:52

标签: go goroutine

我正在制作它以便在CTRL-C上停止要求输入。

我目前所拥有的是一个单独的go-routine,在收到CTRL-C后,会改变变量的值,所以它不会要求另一行。但是,我似乎找不到绕过当前行的方法。

即。我仍然需要输入一次,以退出当前的\ n读取迭代。

是否有一种方法可以将“\ n”推入stdin,以便阅读器读取。阅读。或者一种完全停止执行的方法。

1 个答案:

答案 0 :(得分:0)

当两个事件发生 时,Go允许你继续进行的唯一合适的机制是select,而select只选择频道读取,所以你唯一的选择是更改信号处理程序goroutine以写入通道,并添加另一个处理stdin的goroutine并将输入行传递给通道,然后在两个通道上选择。

然而,这仍然让您的问题半答案:您的主程序可以停止等待Ctrl-C上的输入,但是goroutine的读取输入仍将等待输入。在某些情况下可能没问题......如果你再也不需要stdin,或者你会以同样的方式直接回到处理线。但是如果你想从那个读者那里做一些其他而不是ReadString的事情,你就会陷入困境。我看到的唯一解决方案是在ReadReadByte周围编写自己的状态机,它能够根据外部条件改变其行为,但这很容易变得非常复杂。

基本上,这看起来就像Go简化了与底层系统相比的事情(没有暴露像EINTR这样的东西,不允许选择文件句柄),但最终会给程序员提供更少的权力。