像这里一样,我创建了一个go playground示例:sGgxEh40ev,但无法使其工作。如何根据该例程的返回值来停止goroutine
quit := make(chan bool)
res := make(chan int)
go func() {
idx := 0
for {
select {
case <-quit:
fmt.Println("Detected quit signal!")
return
default:
fmt.Println("goroutine is doing stuff..")
res <- idx
idx++
}
}
}()
for r := range res {
if r == 6 {
quit <- true
}
fmt.Println("I received: ", r)
}
输出:
goroutine is doing stuff..
goroutine is doing stuff..
I received: 0
I received: 1
goroutine is doing stuff..
goroutine is doing stuff..
I received: 2
I received: 3
goroutine is doing stuff..
goroutine is doing stuff..
I received: 4
I received: 5
goroutine is doing stuff..
goroutine is doing stuff..
fatal error: all goroutines are asleep - deadlock!
这可能吗?我错在哪里
您必须结束您的main for循环。正如错误告诉你:没有任何东西到达水库。 – Volker
@Volker,但即使我做'break'循环的主要,然后做'退出< - 真正的',仍然僵局,你可以帮助创建一个工作场所的例子吗? – lnshi
在你的程序中,'res < - idx'和'quit < - true'都等待它们的值被接收,导致死锁。一个更好的使用渠道模式可以在这里找到(https://play.golang.org/p/uf94rfXkva) –