目录
channel 的零值是什么?未初始化的 channel 会发生什么?
无缓冲 channel 和有缓冲 channel 有什么区别?
channel 的发送和接收操作分别会发生阻塞的情况是什么?
如何使用 close() 正确关闭一个 channel?关闭后还能接收或发送吗?
接收已关闭 channel 的数据会返回什么值?是否会 panic?
如何使用 len() 和 cap() 查看 channel 状态?
select 语句的作用是什么?与 switch 有什么区别?
select 在所有 case 都阻塞时会发生什么?如何解决?
select 中默认分支(default)的作用是什么?适合哪些场景?
select 可以处理多个 channel 中哪个先返回的问题吗?
select 中多个 case 同时满足条件时,执行顺序是怎样的?
如何通过 select 模拟非阻塞 channel 发送操作?
select 是否能和 for 循环一起配合使用?典型用法有哪些?
channel 是如何实现 goroutine 之间的同步的?
解释 channel 的 “happens-before” 保证。
如何使用 channel 实现任务管道(pipeline)?
如何实现多消费者安全退出(graceful shutdown)?
如何组合 context 与 channel 实现超时控制?
为什么在向一个已关闭的 channel 发送数据会 panic?
如何避免 goroutine 泄露与 channel 阻塞?
如何使用 Go runtime 检测哪些 goroutine 被 channel 阻塞?
一个协程没有读取 channel,另一个协程持续发送,结果如何?
如何通过 channel 实现并发控制中的 back-pressure?
为什么 channel 不是万能的并发解决方案?什么时候该用别的方案?