这不是关于如何更好地写这个的问题。这是一个专门关于为什么 Go 在这种情况下导致僵局的问题。
package main
import "fmt"
func main() {
chan1 := make(chan bool)
chan2 := make(chan bool)
go func() {
for {
<-chan1
fmt.Printf("chan1\n")
chan2 <- true
}
}()
go func() {
for {
<-chan2
fmt.Printf("chan2\n")
chan1 <- true
}
}()
for {
chan1 <- true
}
}
输出:
chan1
chan2
chan1
chan2
chan1
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
goroutine 5 [chan send]:
goroutine 6 [chan send]:
exit status 2
为什么这不会导致无限循环?怎么会在放弃之前进行两次完整的“ping-ping”(而不是一次)?
浮云间
偶然的你
忽然笑
相关分类