channel原来就是个环形队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了channel原来就是个环形队列相关的知识,希望对你有一定的参考价值。

参考技术A golang有一个很重要的特性就是channel,经常配合goroutine一起使用。

当然,其中也涉及到有缓冲和无缓冲的情况,为什么会造成这种情况,我们会在下面解释。

channel的数据结构不太复杂,就是一个环形队列,里面保存了长度qcount,容量dataqsiz,数据buf,以及前后索引sendx,recvx。

closed用来标识channel的状态,0表示未关闭,非0表示已关闭,如果关闭,那么就不能发送数据。

在内部有两个make函数,一个是makechan64,一个是makechan,其实makechan64本质上还是调用的makechan。

初始化的时候可以传入长度size,然后根据你初始化数据的类型大小elem.size计算是否有可用空间。

此时,将结构体剩余字段赋值。

就是ch

什么是环形队列,采用什么方法实现环形队列

在用数组表示队列时把数组看成是一个环形的,即令数组中的第一个元素紧跟在最末一个单元之后就形成了一个环形队列。

通常采用逻辑上求余数的方法来实现环形队列,假设数组的大小为n,当元素下标i增1时采用i=(i+1)%n来实现。

扩展资料:

队列的特点是先进先出,或者后进后出。环状队列在数据结构里称为循环队列。也就是把队列的尾和头接在一起形成一个环,这样当发生假溢出时,尾指针可以跳到数组的开始,重复利用那些已经从队列里删掉的存储单元。

可以用数组和两个指针(头指针和尾指针,但数据类型可以为整形,只是表示指向的含义)组成一个结构体来实现队列。

环形队列是一个可以实现所有结构体且可以提高个人对指针的了解的一个程序。

程序是用codeblock写的,中间碰到了一个又一个的问题,都最终解决了。这个结构可以作为所有结构体的实现的一个模式。写写这些程序可以不断让自己更加深入认识指针,更加熟悉指针的各种使用。

参考资料来源:百度百科-环形队列

参考技术A 在用数组表示队列时把数组看成是一个环形的,即令数组中的第一个元素紧跟在最末一个单元之后就形成了一个环形队列。

通常采用逻辑上求余数的方法来实现环形队列,假设数组的大小为n,当元素下标i增1时采用i=(i+1)%n来实现。
参考技术B 环形队列的特点是,不需要进行动态的内存释放和分配,使用固定大小的内存空间反复使用。
非常的简单和高效本回答被提问者采纳

以上是关于channel原来就是个环形队列的主要内容,如果未能解决你的问题,请参考以下文章

什么是环形队列,采用什么方法实现环形队列

环形队列-高效定时触发

go语言数据结构 环形队列

数据结构(10)---队列之环形队列

Java数据结构 -- 环形队列 & 数组模拟环形队列

环形队列