回顾 Go Go 和 Go 内存模型之后,我还是有点不清楚 Go 通道是如何在幕后工作的。 ; P. A0 J) s" T9 F+ Z它们的结构是什么?它们的行为有点像线程安全队列/数组。 # w% h1 E( H4 A2 ]2 k" h% i它们的实现取决于结构吗?; |: R3 C- h3 W m% l( G; B
. o8 v( Y' A' b9 [解决方案: 0 B7 I8 u- j* s0 B E 源文件(来自你的 go 源代码根src/pkg/runtime/chan.go 中。 0 w4 y! n9 X* F' G. }hchan它是带有发送和接收链表的通道中心数据结构(持有指向它们的 goroutine 和数据元素的指针)和一个closed标志。有一个Lock在 runtime2.go 中定义的嵌入式结构,根据操作系统作为互斥锁 (futex) 或信号量。在 实现锁定lock_futex.go (Linux/Dragonfly/Some BSD) 或 lock_sema.go (Windows/OSX/Plan9/Some BSD) 中,基于标签的构建。- ] f/ S7 O6 h# q/ s1 a
通道操作都在这个chan.go所以你可以在文件中看到它makechan、send和receive操作,以及select构造、close、len和cap内置。/ U: @6 N! ^0 Q; |- g$ _2 r
要深入了解渠道的内部工作原理,必须阅读Dmitry Vyukov 我写的Go 通道(Go 核心开发人员,goroutines、调度程序、通道等。