我有一个go func,如果在默认情况下运行它,我想停止它。如果已经返回func,则以下方法在quit <- true
被阻止。
quit := make(chan bool)
go func() {
for {
select {
case <- quit:
return
default:
// Do other stuff and return if complete.
}
}
}()
// Do stuff
// Quit goroutine
quit <- true
答案 0 :(得分:2)
关闭退出渠道,而不是发送值。循环将退出,因为在封闭通道上的接收返回零值。
此外,将频道声明为chan struct{}
以指示频道值对节目不重要:
quit := make(chan struct{})
go func() {
for {
select {
case <- quit:
return
default:
// Do other stuff and return if complete.
}
}
}()
// Do stuff
// Quit goroutine
close(quit)
如果你需要打破&#34;其他东西&#34;,那么将退出频道传递给&#34;其他东西&#34;并经常检查:
select {
case <- quit:
return
default:
}
... keep going
如果你做的不仅仅是这个答案中的第一个片段,那么你应该考虑使用标准的context包来取消信号。