iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > GO >怎么在Golang中实现channel
  • 941
分享到

怎么在Golang中实现channel

2023-06-14 23:06:33 941人浏览 泡泡鱼
摘要

怎么在golang中实现channel?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是Golanggolang 是Google开发的一种静态强类型、编译型、

怎么在golang中实现channel?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

什么是Golang

golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,其语法与 C语言相近,但并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能。

一.简介

channel是Go语言在语言级别提供的goroutine间的通信方式,可以使用channel在两个或多个goroutine之间传递消息。channel是进程内通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针。如果需要跨进程通信,建议使用分布式系统来解决,比如使用Socket或者Http等通信协议。

channel是类型相关的,也就是说,一个chennel只能传递一种类型的值,这个类型需要在声明channel时指定。注意,在GO语言中channel本身也是一个原生类型,与map之类的类型地位一样,因此channel本身在定义后也可以通过channel传递。

二.底层实现

2.1 hchan结构

type hchan struct {   qcount   uint           // 队列中当前数据的个数   dataqsiz uint           // size of the circular queue   buf      unsafe.Pointer // 数据缓冲区,存放数据的环形数组   elemsize uint16 // channel中数据类型的大小(单个元素的大小)   closed   uint32 // 表示channel是否关闭标识位   elemtype *_type // 队列中的元素类型   sendx    uint   // 当前发送元素的索引   recvx    uint   // 当前接收元素的索引   recvq    waitq  // 接受等待队列,由recv行为(也就是<-ch)阻塞在channel上的goroutine队列   sendq    waitq  // 发送等待队列, 由send行为(也就是ch<-)阻塞在channel上的goroutine队列   //lock保护chann中的所有字段,以及在此通道上阻塞的sudoG中的几个字段。   //保持此时不要更改另一个G状态(特别是没准备好G),因为这可能会因堆栈收缩而死锁   lock mutex}//发送及接收队列的·1结构体type waitq struct {    first *sudog    last  *sudog}
  • qcount uint // 当前队列中剩余元素个数。

  • dataqsiz uint // 环形队列长度,即缓冲区的大小,即make(chan T,N),N。

  • buf unsafe.Pointer // 环形队列指针。

  • elemsize uint16 // 每个元素的大小。

  • closed uint32 // 表示当前通道是否处于关闭状态。创建通道后,该字段设置为0,即通道打开; 通过调用close将其设置为1,通道关闭。

  • elemtype *_type // 元素类型,用于数据传递过程中的赋值。

  • sendx uint 和 recvx uint是环形缓冲区的状态字段,它指示缓冲区的当前索引 - 支持数组,它可以从中发送数据和接收数据。

  • recvq waitq // 等待读消息的goroutine队列。

  • sendq waitq // 等待写消息的goroutine队列。

  • lock mutex // 互斥锁,为每个读写操作锁定通道,因为发送和接收必须是互斥操作。

2.2 创建过程

2.2.1 写入操作

创建带buffer的channel

怎么在Golang中实现channel

向channel中写入数据

怎么在Golang中实现channel

怎么在Golang中实现channel

3 写入过程如下:

怎么在Golang中实现channel

  • 锁定整个管道结构。

  • 确定写入,尝试从等会带队列等待goroutine,然后将元素直接写入goroutine。

  • 如果recvq为空,则确定缓冲区是否可用。如果可用,从当前goroutine复制数据到缓冲区。

  • 如果缓冲区已满,则要写入的元素将保存在当前正在执行的goroutine结构中,并且当前goroutine将在sendq中排队并从运行中挂起。

  • 写入完成释放锁。

2.2.2 读取过程

怎么在Golang中实现channel

怎么在Golang中实现channel

怎么在Golang中实现channel

  • 先读取channel全局锁。

  • 尝试sendq从等待队列中获取等待的goroutine。

  • 如果有等待的goroutine,且有缓冲区(缓冲区已满),从缓冲区队首取出数据,再从sendq取出一个goroutine。将goroutine中数据存入buf对位,结束读取释放锁。

  • 如没有后等待的goroutine,且缓冲区有数据,直接读取缓冲区数据,解释读取释放锁。

  • 如果没有等待的goroutine,且没有缓冲或缓冲区域为空,将当前的goroutine加入denq排队,进入睡眠,等待被写goroutine唤醒。结束释放锁。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网GO频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在Golang中实现channel

本文链接: https://www.lsjlt.com/news/275678.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Golang中实现channel
    怎么在Golang中实现channel?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是golanggolang 是Google开发的一种静态强类型、编译型、...
    99+
    2023-06-14
  • 怎么在Golang中监听多个channel
    本篇内容介绍了“怎么在Golang中监听多个channel”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!select 关键字我们可...
    99+
    2023-07-05
  • golang中channel怎么使用
    今天小编给大家分享一下golang中channel怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是 channe...
    99+
    2023-06-29
  • golang channel怎么关闭
    Golang是一种十分简洁高效的编程语言,支持并发编程。在Golang中,channel是一种非常重要的并发通信机制,它可以用于协调两个并发执行的任务之间的同步操作。但是在使用channel的过程中,我们也会遇到一些问题,尤其是当我们需要关...
    99+
    2023-05-14
  • Golang中怎么读写Channel数据
    本文小编为大家详细介绍“Golang中怎么读写Channel数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang中怎么读写Channel数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Channel...
    99+
    2023-07-04
  • 讨论golang channel的实现方法
    Golang是一门相对年轻的编程语言,但它已经受到越来越多的开发者的关注。这是它可以轻松地与其他语言进行交互和使用,并且它有一个强大且简单的并发模型,其中包括channel。本文将讨论golang channel的实现方法及其用途。什么是g...
    99+
    2023-05-14
  • 在Golang中怎么实现Cache::remember
    这篇文章主要介绍在Golang中怎么实现Cache::remember,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!项目需要把部分代码移植到 Golang , 之前用 Laravel 封装的写起来很舒服,在 Gola...
    99+
    2023-06-14
  • 在Golang中怎么实现求和
    今天小编给大家分享一下在Golang中怎么实现求和的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先,我们可以使用循环的方式...
    99+
    2023-07-05
  • Golang怎么使用channel实现一个优雅退出功能
    这篇文章主要介绍了Golang怎么使用channel实现一个优雅退出功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang怎么使用channel实现一个优雅退出功能文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • 详解如何在Golang中监听多个channel
    目录select 关键字如果我们不知道工作何时会结束呢如何使select成为非阻塞式的select 关键字 我们可以使用select关键字来同时监听多个goroutine。...
    99+
    2023-03-19
    Golang监听多个channel Golang监听channel Golang channel
  • 怎么在golang中实现负载均衡
    本篇文章为大家展示了怎么在golang中实现负载均衡,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部...
    99+
    2023-06-14
  • 怎么在conda中设置channel镜像
    这期内容当中小编将会给大家带来有关怎么在conda中设置channel镜像,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 显示所有channel首先,conda config --show能够显示出所有...
    99+
    2023-06-15
  • Golang使用channel实现一个优雅退出功能
    目录前言实现思路读源码HookEngine Status优雅退出自己实现适配 Hook适配 Engine Status适配 Graceful Shutdown总结前言 最近补 Gol...
    99+
    2023-03-09
    Golang channel实现退出功能 Golang channel退出 Golang channel
  • Go channel实现原理是什么
    本篇内容主要讲解“Go channel实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go channel实现原理是什么”吧!channel单纯地将函数并发执行是...
    99+
    2023-07-05
  • Go中怎么使用channel
    这篇文章将为大家详细讲解有关Go中怎么使用channel,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、使用channel等待任务结束使用案例还是在第一篇的第二节中写的代码,不过这里只需要一段即可。pa...
    99+
    2023-06-20
  • golang怎么实现判断key是否在map中
    这篇文章主要介绍golang怎么实现判断key是否在map中,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!golang适合做什么golang可以做服务器端开发,但golang很适合做日志处理、数据打包、虚拟机处理、数...
    99+
    2023-06-14
  • Golang中怎么实现枚举
    这篇文章主要介绍了Golang中怎么实现枚举的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang中怎么实现枚举文章都会有所收获,下面我们一起来看看吧。在编程领域里,枚举用来表示只包含有限数量的固定值的类型...
    99+
    2023-07-02
  • Golang中怎么实现队列
    本篇内容介绍了“Golang中怎么实现队列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是队列队列是一种特殊的线性数据结构,它遵循先进先...
    99+
    2023-07-05
  • golang中的session怎么实现
    这篇文章主要介绍了golang中的session怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang中的session怎么实现文章都会有所收获,下面我们一起来看看吧。什么是 SessionSess...
    99+
    2023-07-06
  • 怎么在Golang中实现一个简单的Http中间件
    本篇内容主要讲解“怎么在Golang中实现一个简单的Http中间件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Golang中实现一个简单的Http中间件”吧!本文主要针对Golang的内...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作