- func main() {
- ch := make(chan int)
- ch<-1
- fmt.Println(<-ch)
- }
报错fatal error: all goroutines are asleep - deadlock
golang中无缓冲chan的数据传递是同步的,处理不当会造成死锁
go中,main函数已协程的方式执行,在make(chan int)后,我们得到了一个无缓冲的通道,无缓冲的chan的数据读写是同步的,在写的时候,会去等待另一个协程去读,因此在ch<-1这一步就把main这个协程阻塞了,造成死锁,后面的<-ch是不会执行的。
1、开另一个协程处理写操作
func main() { ch := make(chan int) go func() { ch<-1 } fmt.Println(<-ch) }2、改为有缓冲通道
func main() { ch := make(chan int, 1) ch<-1 fmt.Println(<-ch) }