package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for {
select {
case v := <-ch1:
fmt.Println("ch1: ", v)
ch2 <- v // 到这里阻塞了
fmt.Println("send to ch2")
case v := <-ch2:
fmt.Println("ch2: ", v)
}
}
}()
ch1 <- 1
for {
time.Sleep(1 * time.Second)
}
}
程序输出
ch1: 1
有疑问加站长微信联系(非本文作者)

我的理解是因为你是在 一个协程中对同一个 channel进行的读写操作,会等待
向无缓存的chan发送数据,这个携程就被一直阻塞了,后一个case无法执行,因为这个携程处于阻塞态。而如果,你在外面接收
ch2
的数据,就会释放阻塞态。输出结果:
而如果你想要实现你想要的结果,则只需要将给
ch2
发送数据,包含到另一个携程中:非常感谢
是的, 看了其他答案的例子理解了, 要用新的协程处理
无缓冲区的通道读和写要同时准备好才行,而且读要先准备好,如果写到通道里读没有准备好后就会发生堵塞。