关于未初始化channel 读写问题

来源:1-6 Go 语法背后的秘密

Yu_uuuu20

2021-05-21 10:54:54

问题描述

在读写nil channel的时候会永久阻塞,阅读源码发现 chansend chanrecv 开头都判断了 ch 为 nil 就直接 gopark

if c == nil {
		if !block {
			return
		}
		gopark(nil, nil, waitReasonChanReceiveNilChan, traceEvGoStop, 2)
		throw("unreachable")
	}

想问一下为什么要这么做呢?有什么应用场景吗

写回答

1回答

Xargin

2021-05-21

https://medium.com/justforfunc/why-are-there-nil-channels-in-go-9877cc0b2308


看看这篇文章里提的例子,


TLDR; merge 多个 channel 的时候,如果 select 里的某个 case 的 channel 已经 close 了,可以把它置为 nil,避免 busy loop 浪费 CPU


0

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程