gpt4 book ai didi

loops - 用信号中断 Golang 中的无限循环

转载 作者:IT王子 更新时间:2023-10-29 02:21:15 24 4
gpt4 key购买 nike

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

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

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 那样简单,因为它需要用户在它之后按回车键。它需要一些特定于操作系统的代码才能这样做,但希望库可以为您省去所有麻烦,例如 termbox-go .

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

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

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

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

注意:由于库的选择可以多种多样,代码也有很大的不同,所以我认为我不能(或不应该)提供一个例子。

关于loops - 用信号中断 Golang 中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48653502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com