我正在尝试制作一个使用信号来中断无限计数器循环的程序。 我设法用SIGINT(ctrl + C)中断了程序,但是我无法以其他方式中断它。 我想知道是否可以通过其他方式中断循环,例如在终端运行时按Q键。

我制作了两个Go文件,第一个包含实际的无限循环:

然后该文件捕获SIGINT信号并中断循环:

然后,我会坚持我的第一个评论。我会解释更多。

您不需要发出信号来终止程序-您可以控制它。任何时候调用os.Exit都会退出程序,并且从main()返回具有相同的效果。

问题是,何时触发这些"退出"。或者,在您的示例中,当按下key Q时如何触发退出。

要解决该问题,您需要将其分解为多个部分。正如我在评论中所说,第1部分正在捕获按键。它不像fmt.Scan那样简单,因为它要求用户在其后按Enter。为此,需要一些特定于操作系统的代码,但是希望lib可以省去您的麻烦,例如termbox-go。

第2部分与第1部分紧密相关。即指定事件,即击键。在您的示例中,要知道按下的键是Q,然后调用os.Exit。通常,一个lib可以很轻松地处理该问题,有时一个人几乎不会注意到其中有一部分。但是,如果您想要一些更复杂的按键,例如ctrl-alt-backspace或什至a-s-d-f(同时),则将需要一些代码。

第三部分是关于不阻止程序。在Go中,可以使用单独的goroutine检查事件循环或使用旧的回调方法来轻松实现。这取决于您选择的图书馆。

有关信号和ctrl-c情况的更多信息。在大多数情况下,ctrl-c势必会向该程序发送一个信号。如果未修改,则sigint终止程序。但是,程序可以修改处理sigint的行为,就像您的原始代码一样(添加要打印的消息)。当按下其他键时,操作系统不太可能将其绑定到另一个信号,因此您无法处理它。

当然,另一个解决方案是将一个键组合(多个键击)绑定到向程序发送信号,但是只要程序是接收键击本身的程序,那就是多余的。

注意:由于库的选择可以变化,因此代码也有很大差异,因此我认为我不能(或应该)提供示例。