其他
golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?
问题
对已经关闭的的 chan
进行读写,会怎么样?为什么?
怎么答
读已经关闭的 chan
能一直读到东西,但是读到的内容根据通道内关闭前
是否有元素而不同。如果 chan
关闭前,buffer
内有元素还未读 , 会正确读到chan
内的值,且返回的第二个 bool 值(是否读成功)为true
。如果 chan
关闭前,buffer
内有元素已经被读完,chan
内无值,接下来所有接收的值都会非阻塞直接成功,返回channel
元素的零值,但是第二个bool
值一直为false
。写已经关闭的 chan
会panic
举例
1. 写已经关闭的 chan
注意这个 send on closed channel
,待会会提到。
2. 读已经关闭的 chan
多问一句
1. 为什么写已经关闭的 chan
就会 panic
呢?
当 c.closed != 0
则为通道关闭,此时执行写,源码提示直接 panic,输出的内容就是上面提到的"send on closed channel"
。
2. 为什么读已关闭的 chan
会一直能读到值?
c.closed != 0 && c.qcount == 0
指通道已经关闭,且缓存为空的情况下(已经读完了之前写到通道里的值)如果接收值的地址 ep
不为空那接收值将获得是一个该类型的零值 typedmemclr
会根据类型清理相应地址的内存这就解释了上面代码为什么关闭的 chan
会返回对应类型的零值
文章推荐:
对未初始化的的 chan 进行读写,会怎么样?为什么? golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出私有变量的 tag? golang 面试题:json 包变量不加 tag 会怎么样? golang 面试题:怎么避免内存逃逸? golang 面试题:简单聊聊内存逃逸? golang 面试题:字符串转成 byte 数组,会发生内存拷贝吗? golang 面试题:翻转含有 中文、数字、英文字母
的字符串golang 面试题:拷贝大切片一定比小切片代价大吗? golang 面试题:能说说 uintptr 和 unsafe.Pointer 的区别吗?