我正在尝试制作一个程序,该程序使用信号中断无限计数器循环。我已经设法用Sigint(CTRL C(中断了该程序,但否则我无法中断。我想知道我是否可以制作其他方式来中断循环,例如,在Q键在终端运行时按照Q键。
我制作了两个档案,第一个包含实际的无限循环:
package infinite
import "fmt"
import "time"
func Infinite01 (msg string) {
for i := 0; ; i++ {
fmt.Println(msg, i)
time.Sleep(time.Second)
}
}
然后文件以捕获Sigint信号并中断循环:
package main
import (
"./infinite"
"os/signal"
"os"
"fmt"
)
func main() {
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, os.Interrupt)
go func() {
<-sigs
fmt.Printf("You pressed ctrl + C. User interrupted infinite loop.")
os.Exit(0)
}()
Loop()
}
func Loop() {
infinite.Infinite01("Look, I can count forever:")
}
然后我会坚持我的第一个评论。我会再解释一点。
您不需要信号即可终止程序 - 您可以控制它。随时致电os.Exit
将退出程序,从main()
返回具有相同的效果。
问题是,何时触发这些"退出"。或者,在您的示例中,按下key Q
时如何触发出口。
要解决问题,您需要将其分为部分。正如我在评论中所说的那样,第1部分正在捕获钥匙中风。它不像fmt.Scan
那样简单,因为它需要用户按ENTER之后按Enter。它需要一些特定的OS代码才能这样做,但是希望Lib可以为您节省所有麻烦,例如Termbox-go。
第2部分与第1部分密切相关,即指定事件,密钥冲程。在您的示例中,知道按键是Q,然后致电os.Exit
。通常,LIB可以很容易地处理这么容易,有时很难注意到有一部分。但是,如果您想要一些更复杂的密钥stokes,例如ctrl-alt-backspace
,甚至a-s-d-f
(同时(,这将需要一些代码。
第三部分是关于不阻止程序。在旅途中,可以通过使用单独的goroutine检查事件循环或使用良好的回调方式来轻松实现。取决于您选择的库。
有关信号和ctrl-c
情况的更多信息。在大多数情况下,ctrl-c
势必会向程序发送SIGINT是很普遍的做法。如果未修改,Sigint将终止程序。但是,程序可以像您的Orignal代码一样修改处理Sigint的行为(为打印添加消息(。按下其他键时,OS不太可能将其绑定到另一个信号,因此您无法处理。
另一个解决方案是将键堆肥(多个密钥冲程(绑定到向程序发送SIGINT,但是只要程序是接收钥匙中风本身的程序,那就是一个通用的。
。注意:由于可以选择LIB的选择,因此代码有很大不同,因此我认为我不能(或应该(提供一个示例。