在简要回顾了Go语言规范,有效的Go和Go内存模型之后,我仍然不清楚Go通道是如何工作的。
它们是什么样的结构?它们的行为有点像线程安全队列/数组。
它们的实现取决于体系结构吗?
通道的源文件位于/src/pkg/runtime/chan.go中(从您的源代码根目录开始)。
hchan是通道的中央数据结构,带有发送和接收链接列表(持有指向其goroutine和data元素的指针)和一个closed标志。Lock在runtime2.go中定义了一个嵌入式结构,根据操作系统的不同,该结构可用作互斥体(futex)或信号灯。根据构建标记,锁定实现位于lock_futex.go(Linux / Dragonfly / Some BSD)或lock_sema.go(Windows / OSX / Plan9 / Some BSD)中。
hchan
closed
Lock
通道操作都是在此chan.go文件中实现的,因此您可以看到makechan,send和receive操作以及select构造,close,len和cap内置函数。
要深入了解通道的内部工作原理,您必须阅读Dmitry Vyukov亲自撰写的关于类固醇的Go通道(Go核心开发人员,goroutines,调度程序和通道等)。