Go频道如何实施?

在简要地回顾Go语言规范,有效的Go和Go记忆模型之后,我仍然不清楚Go渠道是如何工作的。

他们是什么样的结构? 它们的行为就像一个线程安全的队列/数组。

他们的实现是否依赖于架构?

频道的源文件(来自您的源代码的根目录)位于/src/pkg/runtime/chan.go中 。

hchan是一个通道的中心数据结构,带有发送和接收链接列表(持有指向他们的goroutine和数据元素的指针)和一个closed标志。 在runtime2.go中定义了一个Lockembedded式结构,根据操作系统的不同,它可用作互斥锁(futex)或信号量。 基于构build标签,locking实现在lock_futex.go(Linux / Dragonfly /一些BSD)或lock_sema.go(Windows / OSX / Plan9 /一些BSD)中。

通道操作都在这个chan.go文件中实现,所以你可以看到makechan,send和receive操作,以及select构造,close,len和cap内置。

要深入了解渠道的内部运作情况,您必须阅读由Dmitry Vyukov本人(Go core dev,goroutines,scheduler和channels等)进行的关于类固醇的Go渠道 。