如何停止可能是也可能不是 运行 的 goroutine?

how to stop a goroutine which may or may not be running?

我有一个 go func,如果 运行 默认为 运行 我想停止它。如果 go 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

关闭退出通道而不是发送值。循环将退出,因为在关闭的通道 returns 上接收到零值。

此外,将通道声明为 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)

如果您需要突破 "other stuff",请将退出通道传递给 "other stuff" 并时不时检查一下:

select {
case <- quit:
    return
default:
}
... keep going

如果您所做的不仅仅是此答案中的第一个片段,那么您应该考虑使用标准 context 包来取消信号。