Goland 通道

news2024/9/20 20:35:50

channel通道

目录

channel通道

channel介绍

 channel基本使用

有缓存通道和无缓存通道的区别

 通道的初始化,写入数据到通道,从通道读取数据及基本的注意事项

 channel的关闭和遍历

channel的关闭

为什么关闭

如何优雅地关闭通道

 channel的遍历

 channel的细节

关于channel的只读和只写

 select


channel介绍

  1. channel本质是一个数据结构-队列【示意图】
  2. 数据是先进先出
  3. 线程安全,多goroutine访问时,不需要加锁,channel本身是线程安全的
  4. channel是他有类型的,一个string类型的channel只能存放string类型的数据
  5. 示意图:

 channel基本使用

对于一个intChan类型的变量来讲,intChan地址里面存放了一个16位的管道的地址

有缓存通道和无缓存通道的区别

  1. 无缓存通道:发送方向通道发送数据时会阻塞,直到有接收方接收数据。接收方接收数据时也会阻塞,直到有发送方发送数据。这种通道保证了发送和接收的同步性,非常适合在goroutine之间进行数据交换和同步
  2. 有缓存通道:创建时指定了一个固定大小的缓冲区,发送方向通道发送数据时如果缓冲区未满,则不会阻塞;接收方接受数据时如果缓冲区非空,则不会阻塞。这种通道允许发送和接收的处理速度不同步,提高程序的并发性能。

 通道的初始化,写入数据到通道,从通道读取数据及基本的注意事项

 

 channel的关闭和遍历

channel的关闭

使用内置函数close关闭channel,当channel关闭后,就不能再向channel写数据,但是仍然可以从该channel读取数据。通道的关闭问题并没有这么简单,错误的关闭通道将会引起panic。

为什么关闭
  1. 告知接收方通道已经关闭:关闭通道可以让接受方知道不会再有新的数据发送过来,避免接收方无限等待新数据
  2. 避免死锁:如果通道没有关闭,接收方会一直阻塞在接收操作上
  3. 释放资源:对于使用缓存的通道关闭可以释放缓存区占用的内存。
如何优雅地关闭通道

1)遵守通道关闭原则

2)不要让通道的接收者关闭通道

这篇简书整理了一份关于通道关闭的方法及原则

 channel的遍历

注意:不能使用普通的for循环遍历

channel支持for-range的方式进行遍历

  • 在遍历时,如果channel没有关闭,则会出现deadlock的错误
  • 在遍历时,如果channel已经关闭,则会正常遍历数据,遍历完成后退出

 channel的细节

关于channel的只读和只写
func main() {
    //管道可以声明为只读或者只写

    //1.在默认情况下,管道是双向的
    //var chan1 chan int  可读可写

    //2.声明为只写
    var chan2 chan<- int
    chan2 = make(chan int, 3)
    chan2 <- 20
    //num := <-chan2  //error
    //3.声明为只读
    var chan3 <-chan int
    num2 := <-chan3
    fmt.Println("num2", num2)
}

只读只写不代表它的类型,只代表了它的属性

 select

使用select可以解决从通道取数据的阻塞问题

func main() {
    //使用select可以解决从管道取数据的阻塞问题

    //1.定义一个 管道 10个数据 int类型
    //2.定义一个 管道 5个数据 string类型
    intChan := make(chan int, 10)
    for i := 0; i < 10; i++ {
       intChan <- i
    }
    stringChan := make(chan string, 5)
    for i := 0; i < 5; i++ {
       stringChan <- "hello" + fmt.Sprintf("%d", i)
    }

    //传统方法在遍历管道时,如果不关闭会导致死锁,但是在实际开发中可能不明确关闭管道的时间
    //解决办法:select
    for {
       select {
       //注意如果管道最终没有关闭,也不 会一直阻塞导致死锁
       //会自动到下一个case匹配
       case v := <-intChan:
          fmt.Printf("从intChan读取了数据%d\n", v)
       case v := <-stringChan:
          fmt.Printf("从stringChan读取了数据%s\n", v)
       default:
          fmt.Println("都取不到了")
          return
       }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊插件安装教程,新手必学的两个选品步骤

亚马逊插件安装教程&#xff0c;跟卖新手必学&#xff0c;选品两个步骤。 大家好&#xff0c;今天讲下erp的插件下载和跟卖采集。erp更新到13.8版本了。 点击右上角的插件下载&#xff0c;已经下载到桌面了&#xff0c;已被压缩。 点击设置&#xff0c;选择扩展&#xff0c;…

python-亲和数(赛氪OJ)

[题目描述] 古希腊数学家毕达哥拉斯在自然数研究中发现&#xff0c;220 的所有真约数(即不是自身的约数)之和为&#xff1a; 1245101120224455110&#xff1d;284 。 而 284 的所有真约为 1 、 2 、 4 、 71 、 142 &#xff0c;加起来恰好为 220 。人们对这样的数感到很惊奇&a…

【研路导航】重庆大学计算机保研面试真题分享交流

写在前面 在保研的道路上&#xff0c;面试是非常重要的一环。这里是成功保研到重庆大学的学长的计算机保研面试的部分真题及详细解答 ! Q 快速排序和合并排序&#xff1a; 快速排序(quicksort) 和合并排序(merge sort) 两种方法都将输入的待排序序列划分为2个子序列&#xf…

centos单机配置多个内网IP地址

centos单机配置多个内网IP地址 引配置1. 查看当前网络IP配置2. 打开网络配置目录3. 设置静态IP4. 编辑ifcfg-eno1:15. 重启网络配置 引 同一个局域网&#xff0c;但是对接的多个子系统使用了不同的网段&#xff0c;如一个系统主机IP地址是192.168.10.1&#xff0c;另一个系统主…

2024 辽宁省大学数学建模竞赛A题 风切变影响及处置 完整思路 代码结果分享(仅供学习)

风切变对航空安全会构成危害。航空人员需了解相关知识&#xff0c;掌握相应技术&#xff0c;从而在遭遇上述天气时最大程度的规避风险&#xff0c;保证飞行安全。 风切变是指在大气中相对比较短的距离内或时间段内产生的风速大小、方向大幅度变化的现象。通常将发生在距离地面…

Rust Hello

首先还是安装&#xff1a; 一定要换源&#xff0c;否则真的太慢了。 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh 就是~/.cargo/config [source.crates-io] # 替换成你偏好的镜像源 replace-with tuna# 清华大学 5mb [source.tuna] registry "htt…

课程的概述

课程概述 课程类型 课程理论流派 制约课程开发的因素 课程设计的概念及两种模式 课程内容 课程评价 新课程改革理念

python基础语法 005 函数1-2 函数作用域

1 函数续 1.7 函数作用域 1.7.1 全局变量 定义在函数外部的变量全局变量在函数内部和函数外部都可以访问使用 a 100 def run():print("a {}".format(a))print(a) print(run())1.7.2 局部变量 函数是一个黑盒子&#xff0c;外面看不到盒子里面的东西&#xff0…

QEMU模拟器源码编译与使用

QEMU模拟器源码编译与使用 1 编译MySBIBenOS2 编译QEMU3 QEMU运行MySBIBenOS4 使用gdb调试QEMU5 通过QEMU调试指令6 小结 本文属于 《RISC-V指令集差分测试&#xff08;DiffTest&#xff09;系列教程》之一&#xff0c;欢迎查看其它文章。 1 编译MySBIBenOS 参考《NEMU模拟器…

AI绘画Midijourney操作技巧及变现渠道喂饭式教程!

前言 盘点Midijourney&#xff08;AIGF&#xff09;热门赚米方法&#xff0c;总有一种适合你之AI绘画操作技巧及变现渠道剖析 【表情包制作】 首先我们对表情包制作进行详细的讲解&#xff1a; 当使用 Midjourney&#xff08;AIGF&#xff09; 绘画来制作表情包时&#xff…

【Linux网络】网络基础

本篇博客整理了 Linux 网络编程的前置知识&#xff0c;例如网络的发展、协议和协议栈分层、网络通信原理、网络地址等&#xff0c;为后续进入 Linux 网络编程作铺垫。 目录 一、网络发展 二、网络协议 1&#xff09;协议的作用 2&#xff09;协议栈 3&#xff09;协议分层…

自动驾驶(萝卜快跑)是毁灭出租司机工作机会的灾难?

引言 自动驾驶技术的飞速发展在全球范围内引发了广泛的讨论和担忧&#xff0c;特别是在中国&#xff0c;自动驾驶出租车服务“萝卜快跑”成为了热门话题。本文探讨自动驾驶对出租司机工作机会的影响&#xff0c;以及这种技术变革背后的社会经济因素。 自动驾驶的历史与现状 …

yoloV8导出engine模型

yoloV8导出engine模型 引言&#xff1a; 目的是TensorRT加速YOLO实例分割模型。 本博客记录达成此目的所需的步骤&#xff0c;及步骤中可能遇到的问题。 as follow&#xff1a; 1. 首先导出onnx模型的脚本命令&#xff1a; yolo export modelbest.pt formatonnx opset12 simpl…

全网都在找数学建模美赛模版,免费直接复制,无需关注公众号!!!

文件夹结构如下 美版论文模版预览(截选) tex文件代码如下 \documentclass{mcmthesis} \mcmsetup{CTeX false, % 使用 CTeX 套装时&#xff0c;设置为 truetcn 1111111, problem ABCDEF,sheet true, titleinsheet true, keywordsinsheet true,titlepage false, abstra…

C++ | Leetcode C++题解之第226题翻转二叉树

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) {return nullptr;}TreeNode* left invertTree(root->left);TreeNode* right invertTree(root->right);root->left right;root->right …

深度学习5 神经网络

生物神经网络是指人的大脑&#xff0c;这是人工神经网络的技术原型。根据生物神经网络的原理&#xff0c;人们用计算机复现了简化的神经网络。当然&#xff0c;人工神经网络是机器学习的一大分支。 1.基本组成 1.1神 经 元 神经元是神经网络的基本组成。激活函数又称作激励函…

【java报错已解决】“Array Out of Bounds“

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法&#xff1a;2.1 方法一&#xff1a;范围检查2.…

案例效果展示小程序制作承载信息宣传

如工商财税、房地产、装修、鲜花、五金等很多行业&#xff0c;都有商品/服务/案例/效果等展示宣传获客的需求&#xff0c;传统线下门店/传单方式效果比较低&#xff0c;线上渠道则更多更利于商家随时开展。 然而更多的图片和文字介绍分享混乱难以整理且无法全面覆盖&#xff0…

如何利用人工智能大模型分析流量来源,提升数字化营销效果

摘要 流量来源分析是数字化营销中的一个重要环节&#xff0c;它可以帮助产品经理和运营人员了解用户从哪里来&#xff0c;为什么来&#xff0c;以及如何留住他们。流量来源分析可以分为三大类&#xff1a;搜索引擎流量&#xff0c;社交媒体流量&#xff0c;和广告投放流量。每…

代理模式(大话设计模式)C/C++版本

代理模式 C #include <iostream> using namespace std;class Subject // Subject 定义了RealSubject和Proxy的共用接口..这样就在任何使用RealSubject的地方都可以使用Proxy { public:virtual void func(){cout << "Subject" << endl;} };class R…