channel是Golang在语言层面提供的goroutine间的通信方式,比Unix管道更易用也更轻便。channel主要用于进程内各goroutine间通信,如果需要跨进程通信,建议使用分布式系统的方法来解决。本章从源码角度分析channel的实现机制,实际上这部分源码非常简单易读。
从数据结构可以看出channel由队列、类型信息、goroutine等待队列组成,下面分别说明其原理。
chan内部实现了一个环形队列作为其缓冲区,队列的长度是创建chan时指定的。下图展示了一个可缓存6个元素的channel示意图:
dataqsiz指示了队列长度为6,即可缓存6个元素; buf指向队列的内存,队列中还剩余两个元素; qcount表示队列中还有两个元素; sendx指示后续写入的数据存储的位置,取值[0, 6); recvx指示从该位置读取数据, 取值[0, 6);
《Go专家编程》深入地讲解了Go语言常见特性的内部机制和实现方式,大部分内容源自对Go语言源码的分析,并从中提炼出实现原理。通过阅读本书,读者可以快速、轻松地了解Go语言的内部运作机制。
本书首先介绍Go语言常见的数据结构及控制结构的实现原理,包括管道、切片、Hash表、select和for-range等,这部分内容大都以几个精心准备的测验题目开头,每个测验题目均对应一个知识点,读者可以借此测验自身对该知识点的掌握程度。接着介绍了Go语言最基础的概念,包括协程的概念、协程调度模型、协程调度策略,以及内存分配和垃圾回收相关的内容。本书还介绍了一些标准库、异常处理和依赖管理等非语法相关但非常重要的内容。最后结合作者的见闻,整理了一些发生在真实项目中的编程陷阱。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !