为什么在使用 select 并顺序将值输入 2 个通道时所有 goroutines 都在睡觉?
Why all goroutines are asleep when using select and sequentially feeding values into 2 channels?
我有 2 个通道,我在 main
函数的开头将值传递给它们,然后我有一个匿名 goroutine,它应该打印值:
package main
import (
"fmt"
)
func main() {
rand1 := make(chan int)
rand2 := make(chan int)
rand1 <- 5
rand2 <- 7
go func() {
select {
case <-rand1:
fmt.Println("rand1")
case <-rand2:
fmt.Println("rand2")
return
}
fmt.Println("test")
}()
}
但是我收到错误 fatal error: all goroutines are asleep - deadlock!
。但是当 rand2
通道收到它的值时,匿名 goroutine 应该 return。
写入通道将阻塞,直到另一个 goroutine 从中读取。在启动 reader goroutine 之前,您的程序正在尝试写入通道。先启动 reader goroutine,然后写入通道。
不是这样写的,goroutine 只会从其中一个通道读取 return,所以你的程序会再次死锁,因为第二次写入会阻塞。
我有 2 个通道,我在 main
函数的开头将值传递给它们,然后我有一个匿名 goroutine,它应该打印值:
package main
import (
"fmt"
)
func main() {
rand1 := make(chan int)
rand2 := make(chan int)
rand1 <- 5
rand2 <- 7
go func() {
select {
case <-rand1:
fmt.Println("rand1")
case <-rand2:
fmt.Println("rand2")
return
}
fmt.Println("test")
}()
}
但是我收到错误 fatal error: all goroutines are asleep - deadlock!
。但是当 rand2
通道收到它的值时,匿名 goroutine 应该 return。
写入通道将阻塞,直到另一个 goroutine 从中读取。在启动 reader goroutine 之前,您的程序正在尝试写入通道。先启动 reader goroutine,然后写入通道。
不是这样写的,goroutine 只会从其中一个通道读取 return,所以你的程序会再次死锁,因为第二次写入会阻塞。