从文档中:
如果通道未缓冲,则发送方将阻塞,直到接收方收到该值为止。如果通道具有缓冲区,则发送方仅阻塞该值,直到将值复制到该缓冲区为止;否则,发送方才阻塞。如果缓冲区已满,则意味着要等到某些接收器检索到一个值。
否则说:
- 当频道已满时,发送方等待另一个goroutine通过接收来腾出空间
- 您会看到一个未缓冲的通道总是一个完整的通道:必须有另一个goroutine来处理发送方发送的内容。
这条线
c <- 1
阻塞,因为通道没有缓冲。由于没有其他goroutine可以接收该值,因此情况无法解决,这是一个僵局。
您可以将频道创建更改为
c := make(chan int, 1)
这样,频道在被阻止之前就可以容纳一个项目。
但这不是并发的意义所在。通常,没有其他goroutine不会使用通道来处理放入内部的内容。您可以这样定义一个接收goroutine:
func main() { c := make(chan int) go func() { fmt.Println("received:", <-c) }() c <- 1 }示范



