问题
对未初始化的的chan进行读写,会怎么样?为什么?
怎么答
读写未初始化的chan都会阻塞。
举例
1.写未初始化的 chan
1 | package main |
1 | // 输出结果 |
注意这个chan send (nil chan),待会会提到。
2.写读未初始化的 chan
1 | package main |
1 | // 输出结果 |
注意这个chan receive (nil chan),待会也会提到。
多问一句
关于chan的面试题非常多,这个是比较常见的其中一个。但多问一句:为什么对未初始化的chan就会阻塞呢?
1.对于写的情况
1 | //在 src/runtime/chan.go中 |
- 未初始化的
chan此时是等于nil,当它不能阻塞的情况下,直接返回false,表示写chan失败 - 当
chan能阻塞的情况下,则直接阻塞gopark(nil, nil, waitReasonChanSendNilChan, traceEvGoStop, 2), 然后调用throw(s string)抛出错误,其中waitReasonChanSendNilChan就是刚刚提到的报错"chan send (nil chan)"
2. 对于读的情况
1 | //在 src/runtime/chan.go中 |
- 未初始化的
chan此时是等于nil,当它不能阻塞的情况下,直接返回false,表示读chan失败 - 当
chan能阻塞的情况下,则直接阻塞gopark(nil, nil, waitReasonChanReceiveNilChan, traceEvGoStop, 2), 然后调用throw(s string)抛出错误,其中waitReasonChanReceiveNilChan就是刚刚提到的报错"chan receive (nil chan)"