【问题标题】:How can I exit reader.ReadString from waiting for user input?如何退出 reader.ReadString 等待用户输入?
【发布时间】:2016-04-22 21:03:52
【问题描述】:

我正在使它停止在 CTRL-C 上要求输入。

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

即我仍然需要按回车键一次,才能退出当前的 \n 阅读迭代。

是否有办法将“\n”推送到标准输入以供 reader.ReadString 读取。或者一种完全停止执行的方法。

【问题讨论】:

  • 不输入值就无法中断读取标准输入。您需要让读取处于待处理状态并忽略它,或者一旦获得所需内容就不要开始新的读取。

标签: go goroutine


【解决方案1】:

当两种情况发生任何一种时,Go 提供的唯一体面机制是 selectselect 仅选择通道读取,因此您唯一的选择是更改信号-handler goroutine 写入一个通道,并添加另一个处理标准输入并将输入行传递到通道的 goroutine,然后在两个通道上进行选择。

但是,这仍然让您的问题半途而废:您的主程序可以停止等待 Ctrl-C 上的输入,但正在读取输入的 goroutine 仍将等待输入。在某些情况下,这可能没问题……如果您不再需要标准输入,或者您将直接以相同的方式返回处理线。但是,如果您想从该读者那里做other而不是ReadString,那么您就被卡住了……从字面上看。我看到的唯一解决方案是围绕ReadReadByte 编写自己的状态机,它能够根据外部条件改变其行为,但这很容易变得非常复杂。

基本上,这看起来像是 Go 与底层系统相比简化了一些事情(不暴露像 EINTR 这样的任何东西,不允许在文件句柄上选择),但最终为程序员提供的功能更少。

【讨论】:

  • 不确定这在代码中的外观。这仍然是我使用 Go 的第一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2014-10-15
  • 2014-01-26
  • 2016-09-26
  • 1970-01-01
相关资源
最近更新 更多