在(简单地)回顾了围棋语言规范、有效围棋和围棋记忆模型之后,我仍然有点不清楚围棋频道是如何在幕后工作的.

它们是什么样的 struct ?它们的行为有点像线程安全的队列/array.

它们的实现是否取决于体系 struct ?

推荐答案

通道的源文件是(从GO源代码根目录)/src/pkg/runtime/chan.go.

hchan是通道的中心数据 struct ,具有发送和接收链表(持有指向它们的goroutine和数据元素的指针)和closed标志.在runtime2.go中定义了一个Lock嵌入式 struct ,它根据操作系统充当互斥(Futex)或信号量.根据构建标记,锁定实现位于lock_futex.go(Linux/Dragonfly/ome BSD)或lock_sema.go(Windows/osx/Plan9/ome BSD)中.

渠道运营都是在这个渠道中实施的.go文件,这样您就可以看到makechan、发送和接收操作,以及select construct、close、len和cap内置程序.

要深入了解通道的内部工作原理,您必须阅读Dmitry Vyukov本人的Go channels on steroids篇文章(请参阅core dev、goroutines、调度器和通道等内容).

Go相关问答推荐

Golang regexpp:获取带有右括号的单词

禁用Golang中的终端

更改位置级别和时间戳零点Golang

在不耗尽资源的情况下处理S3文件下载

你能把用户界面文件中的GTK4应用程序窗口添加到GTK4应用程序中吗?

带有一个新变量的Go冒号等于运算符

如何防止程序B存档/删除围棋中程序A当前打开的文件?

Kafka架构注册表-Broker:Broker无法验证记录

如何模拟go的Elastic search SDK?

日志(log)文件不在 golang 的日志(log)目录中

Go 是否提供了标准或事实上的方法来处理单个语句中的错误(即内联错误处理)?

在多个 struct 体中重用 Go 中的函数

如何在正则表达式中使整个单词可选?

Docker 执行失败并显示cmd/ENTRYPOINT 中的命令未找到

正确的 shell 程序进入 golang alpine docker 容器的入口点?

在本地 go 应用程序上获取秘密的正确策略

加密/椭圆:try 在无效点上进行操作

在 Go 中读取数字行

try 运行 docker-compose up -d 时出现错误

HTTP 重定向不呈现新页面