golang中为何在同一个goroutine中使用无缓冲通道会导致死锁
package main import "fmt" func main() { /* 以下程序会导致死锁 c := make(chan int) c <- 10 n1 := <-c fmt.Println(n1) 为什么在同一个goroutine中使用无缓冲通道会导致死锁? 原因:1. 如果通道无缓冲区,则发送方会阻塞,直到接收方接收到该值 2. 如果通道有缓冲区,则发送方会阻塞到值被复制到缓冲区,然后解堵塞, 如果缓冲区已满,则会阻塞到其它goroutine从通道缓冲区中取走一个数据,然后再将值复制到缓冲区,最后解堵塞 */ // 以下程序就可以正常执行,main goroutine负责从无缓冲通道中接收数据,子goroutine负责往通道中写入数据 c := make(chan int) go func() { for i := 0; i < 10; i++ { c <- i * 10 } close(c) // 关闭通道 }() // 使用此方法必须关闭通道 for i := range c { fmt.Println(i) } /* 使用此方法可以比关闭通道 for i := 0; i < 10; i++ { fmt.Println(<-c) } */ }