Go语言 channel 管道 阻塞 死锁 经典问题
建议阅读:14.2协程间的信道
问题:为什么代码1会报死锁的错误,而代码2不会报错?
代码1:
package main import ( "fmt" ) func main() { ch := make(chan int) ch <- 1 fmt.Println(<-ch) // 1 }
代码2:
package main import ( "fmt" ) func main() { ch := make(chan int, 1) ch <- 1 fmt.Println(<-ch) // 1 }
解答:
因为代码1的channel没有buffer,而代码2的channel设置了buffer为1。
没有buffer的channel只能通过另一个goroutine去读,否则就阻塞了。
可以理解成,代码1执行到 ch <- 1 时只有main一个“协程”(其实是线程),并没有其他协程进行接收 ch
本人是软件工程专业的在校大学本科生,喜欢编程的小伙伴可以加我QQ一起探讨,QQ:312805939