Go-Channel面试精讲从底层结构到select随机性
文章导语
Channel是Go并发编程的灵魂,也是面试重灾区。从"channel的底层结构"到"select的随机性"到"关闭channel的行为",本文覆盖所有面试核心考点。
一、核心考点清单
- hchan结构:buf+sendq+recvq+mutex
- 无缓冲vs有缓冲:同步vs异步
- 发送操作:先检查recvq→再写buf→最后阻塞
- select随机性:pollorder随机打乱,防止饿死
- 关闭行为:close→所有recvq收到零值→send panic
二、面试真题
Q: 对nil channel操作会怎样?
A: 发送/接收→永久阻塞;close→panic;select中nil case被忽略。
Q: 对已关闭channel操作?
A: 接收→零值+false;发送→panic;再次close→panic。
Q: select的default作用?
A: 非阻塞操作,所有case不可执行时走default。
三、全文总结
Channel本质上是一个带互斥锁的环形队列+两个等待队列。select的随机性通过pollorder洗牌实现。
参考文献
- Go源码 runtime/chan.go
- Go Blog - Share Memory By Communicating