Goland 通道

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<- intchan2 = make(chan int, 3)chan2 <- 20//num := <-chan2  //error//3.声明为只读var chan3 <-chan intnum2 := <-chan3fmt.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)}//传统方法在遍历管道时,如果不关闭会导致死锁,但是在实际开发中可能不明确关闭管道的时间//解决办法:selectfor {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.mzph.cn/news/871253.shtml

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

相关文章

小众好玩的赛车游戏:环道巨星 CIRCUIT SUPERSTARS中文安装包

《环道巨星》&#xff08;Circuit Superstars&#xff09;是一款由赛车迷亲手为其他赛车迷打造的俯视角赛车游戏。荟集史上各类赛车运动&#xff0c;旨在提供刺激好玩的驾驶体验&#xff1b;而游戏自带的高技术难度将促使玩家长时间磨砺技巧&#xff0c;以达成完美的一圈。 游戏…

刷题Day50|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II

开启单调栈篇章&#xff1a;单调栈用来找任意一个元素左边或者右边第一个比它大/小的元素&#xff08;或位置&#xff09;。 739. 每日温度 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;使用一个递增单调栈&#xff0c;可以从头到尾或者从尾到头…

js中scrollIntoView第一次不生效,第二次生效

scrollIntoView 方法用于将元素滚动到可视区域。如果在页面加载后立即使用&#xff0c;可能不会生效&#xff0c;因为页面可能还没有完全渲染或者加载完成。 如果是因为元素还没有完全渲染完成&#xff0c;可以在 requestAnimationFrame 中调用 scrollIntoView。 requestAnima…

C# 建造者模式(Builder Pattern)

建造者模式&#xff08;Builder Pattern&#xff09;&#xff0c;也被称为生成器模式&#xff0c;是一种对象构建模式&#xff0c;旨在将复杂对象的构建过程与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。这种模式特别适用于构建具有多个组成部分的复杂对象&am…

2024前端面试真题【CSS篇】

盒子模型 盒子模型&#xff1a;box-sizing&#xff0c;描述了文档中的元素如何生成矩形盒子&#xff0c;并通过这些盒子的布局来组织和设计网页。包含content、padding、margin、border四个部分。 分类 W3C盒子模型&#xff08;content-box&#xff09;&#xff1a;标准盒子模…

【系统架构设计师】九、软件工程(面向对象方法|逆向工程)

目录 六、面向对象方法 6.1 基本概念 6.2 面向对象的分析 6.2.1 用例关系 6.2.2 类之间的关系 6.3 面向对象的设计 6.4 面向对象设计原则与设计模式 6.5 面向对象软件的测试 七、逆向工程 历年真题练习 六、面向对象方法 面向对象的分析方法 (Object-Oriented Analys…

python输出/sys/class/power_supply/BAT0/电池各项内容

读取 /sys/class/power_supply/BAT0/ 目录下的所有相关文件,并输出其内容: import os# 定义电池信息文件的路径 battery_path = "/sys/class/power_supply/BAT0/"# 读取文件内容的函数 def read_battery_info(file_name):try:with open(os.path.join(battery_path…

Mybatis-Plus中LambdaQueryWrapper

基本用法 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; // 假设有一个 User 实体类 LambdaQueryWrapper<User> queryWrapper new LambdaQueryWrapper<>(); // 添加查询条件 queryWrapper.eq(User::getName, "John&quo…

stm32出现hardfault-自动化分析map文件

可通过如下python脚本进行分析: import os import sys #在此输入HardFault_Handler时打印的PC指针 address 0x20006980 #以下代码不要要更改 def is_hex(data): try: int(data, 16) return True except ValueError: return False def find_line_number(map_file, addre…

Rust编程-I/O

文件读取: 依赖&#xff1a;标准库中use std::fs; 模块 读取文件&#xff1a;fs::read_to_string(filepath:string) -> Result<String> String是文件内容 下面代码来自《Rust权威指南》&#xff0c;主要作用是从文件中检索&#xff0c;并返回检索内容所在的行&#xf…

stm32使用双通道ADC读取

Driver_ADC.c 使用了DMA转换 #include "Driver_ADC.h"void Driver_ADC1_Init(void) {/* 1. 时钟配置 *//* 1.1 adc时钟 */RCC->APB2ENR | RCC_APB2ENR_ADC1EN;RCC->CFGR | RCC_CFGR_ADCPRE_1;RCC->CFGR & ~RCC_CFGR_ADCPRE_0;/* 1.2 gpio的时钟 */RCC…

【Linux网络】数据链路层【上】{初识数据链路层/以太网/路由表/MAC地址表/ARP表/NAT表}

文章目录 1.初识数据链路层2.认识以太网2.0前导知识以太网帧和MAC帧CMSA/CD以太网的最小帧长限制是64字节IP层和MAC层 2.1以太网帧格式 3.预备知识计算机网络通信以太网和wifi路由表/MAC地址表/ARP表/NAT表/ACL表 用于同一种数据链路节点的两个设备之间进行信息传递。 1.初识数…

Apache AGE 聚合函数

简介 一般来说&#xff0c;聚合函数 aggr(expr) 会处理每个聚合键在传入记录中找到的所有匹配行&#xff08;键使用等价性进行比较&#xff09;。 在常规聚合&#xff08;即形式为 aggr(expr) 的情况下&#xff09;&#xff0c;聚合值列表是候选值列表&#xff0c;其中所有空…

系统服务综合案例

系统服务综合案例 具体任务&#xff1a; 现有主机 node01和node02&#xff0c;完成如下需求: 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在/nfs/rhce目录 5、该目录…

Clion 使用gdbserver调试FreeSWITCH源码

1.准备环境 window安装clion安装好gdb、ssh、已经编译好的freeswitch可执行文件的docker镜像2.配置clion Settings -> Tools ->SSH Configurations Settings-Build, Execution, Deployment-Toolchains(其实设不设置都行,用默认也行的) Settings-Build, Execution, Depl…

DockerCompose拉取DockerHub镜像,并部署OpenMetaData

参考博主&#xff1a;http://t.csdnimg.cn/i49ET 一、DockerCompose拉取DockerHub镜像 方法一&#xff08;不太行&#xff09;&#xff1a; 在daemon.json文件中添加一些国内还在服务的镜像站&#xff08;可能某些镜像会没有&#xff09; ([ -f /etc/docker/daemon.json ] ||…

人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像

摘要 商品工业属性画像是电商产品经理在进行商品管理、推荐、搜索、广告等业务时的重要依据。通过对商品的工业属性&#xff08;如品类、品牌、规格、功能、风格等&#xff09;的准确识别和标注&#xff0c;可以提高商品的展示效果、匹配度、转化率和用户满意度。然而&#xf…

从概念到完成:Midjourney——设计思维与AI技术的完美结合

文章目录 本文来自 Python学研大本营 作者 学研君 去年 AI 爆火的时候&#xff0c;学研君也赶时髦用上了 Midjourney。平时用它生成图片&#xff0c;感觉生成的图片好看&#xff0c;比上网四处找图更省时省事&#xff0c;更合心意&#xff0c;还不用担心版权问题。 给大家看一下…

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程

自定义实现的Table控件&#xff0c;支持跨qt版本&#xff0c;兼容qt5,qt6&#xff01; 截图如下所示: 黑色风格如下所示&#xff1a; 视频演示入口&#xff1a;Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…

整理:MySQL常见错误解决方法

一、无法连接到 localhost 上的 MySQL 服务器 (10061) 翻译&#xff1a; 无法连接到 localhost 上的 MySQL 服务器。 分析&#xff1a; 这表明 localhost 计算机是存在的&#xff0c;但在这台机器上没有运行 MySQL 服务。或者&#xff0c;机器负载过高未能响应请求也可能导致…