GO channel 学习

引言

单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。
虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。


Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而
不是通过共享内存而实现通信。如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。


Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出
(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也
就是声明channel的时候需要为其指定元素类型。 

package mainimport "fmt"// 类似于pipe[]管道
func main() {//ch := make(chan int, 10) //有缓冲大小的管道//ch <- 12//var x int//x = <-ch//fmt.Println(x)//c := make(chan int) //开辟的空间 cap是3,长度////go func() {//	defer println("go 程关闭")//	fmt.Println("go 程运行正在向chan写入数据")//	c <- 666 //由于是无缓冲的,所以必须得立刻接收,不然一直阻塞//}()//num := <-c//fmt.Println("主程序接受管道 值为:", (num))//fmt.Println(len(c), cap(c))//ch := make(chan int)//go func() {//	defer close(ch) //延迟关闭通道//	for i := 0; i < 5; i++ {//		ch <- i//	}//}()//for {//	if data, ok := <-ch; ok {//		fmt.Println(data)//	} else {//		break//	}//}/*c := make(chan int)go func() {for i := 0; i < 5; i++ {c <- itime.Sleep(1 * time.Second)}close(c)}()//迭代,会自动阻塞for data := range c {fmt.Println(data)}*///	select 多路复用c := make(chan int)quit := make(chan int)go func() {for i := 0; i < 5; i++ {fmt.Println(<-c)}quit <- 0}()fibonace(c, quit)}func fibonace(c, quit chan int) {x, y := 1, 1for {select {case c <- x: //如果c可写 ,x就会进来x, y = y, x+ycase <-quit:fmt.Println("quit")return}}
}

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

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

相关文章

PostgreSQL 创建表格

PostgreSQL 创建表格 PostgreSQL 是一个功能强大的开源对象关系型数据库系统&#xff0c;它使用和扩展了SQL语言&#xff0c;并结合了许多安全存储和扩展最复杂数据工作负载的功能。在PostgreSQL中&#xff0c;创建表格是数据库设计的基础步骤之一&#xff0c;它定义了数据的结…

google 应用内评价

前言&#xff1a; 在应用内拉起 google 评价弹窗&#xff0c;用户提交 Play 商店的评分和评价&#xff0c;无需退出应用或游戏。应用内评价在应用的整个过程中随时触发。用户可以使用 1 到 5 星系统对您的应用进行评分&#xff0c;还可以选择添加评论。评价提交后将发送到 Pla…

016.自定义指纹chromium-随机tls指纹(ja4指纹)

自定义指纹chromium-随机tls指纹(ja4指纹) 一、什么是JA4指纹 JA4指纹可以理解成&#xff1a;将加密算法顺序排序后的ja3指纹。之前写过一篇博客介绍ja3指纹&#xff1a;插眼传送由于之前打乱算法顺序&#xff0c;只会改变ja3指纹和akamai指纹&#xff0c;ja4指纹并不会变。所…

虚拟专用网络(VPN)技术的研究与应用

随着信息技术的飞速发展和网络应用的日益普及&#xff0c;网络安全和隐私保护成为了人们关注的焦点。虚拟专用网络&#xff08;VPN&#xff09;作为一种重要的网络安全技术&#xff0c;通过在公共网络上建立专用网络&#xff0c;实现了数据的安全传输和用户隐私的保护。本文详细…

ASP.NET Core----基础学习06----将所有数据在页面中显示 布局页面的使用

文章目录 1. 将数据以list的形式展示在页面中2. 布局页面的使用3. 自定义设置视图文件是否需要加载的JS 1. 将数据以list的形式展示在页面中 step1:在接口文件中添加新的方法GetAllStudents&#xff08;&#xff09; step2:在mock的数据中添加方法GetAllStudents&#xff08;&a…

关于mogdb vs kingbase的测评 说明

上周5同事转了一个帖子给我&#xff0c;说某公众号写了一篇MogDB vs KingBase的文章测评。该博主使用sysbench测了一些场景&#xff0c;其中大部分场景Mogdb相比KingBase而言表现都要差一些&#xff0c;只有一个场景比kingbase高很多。 老实说第一眼看到这个文章&#xff0c;我…

谷歌Gemini产品大揭秘:AI新纪元即将到来!

谷歌在Google I/O大会上预告了五款备受瞩目的Gemini产品&#xff0c;预计于7月15日和7月18日发布。这些产品将包括新版Imagen3、Gemini定制GPT、个性化回应功能、预设提示词以及录音与Google Photos集成等。 AI-321 | 专注全球AI工具推荐的网站 Ai工具集 | 专注ai人工智能 | 集…

代码随想录算法训练营第37天

卡码网 52. 携带研究材料 链接 #include <iostream> #include <vector> using namespace std;int knapsack(int w, vector<int>& weight, vector<int>& value) {vector<int> dp(w 1, 0);for(int i 0; i < weight.size(); i) {for…

JNI: 在Kotlin和C++之间通过JNI进行接口传递,两边参数定义映射

在Kotlin和C之间通过JNI进行接口传递时&#xff0c;需要注意两边参数定义的映射关系。JNI&#xff08;Java Native Interface&#xff09;为Java&#xff08;Kotlin也适用&#xff09;与本地语言&#xff08;如C/C&#xff09;之间的交互提供了桥梁。在Kotlin中定义的外部函数和…

C语言指针超详解——强化篇

C语言指针系列文章目录 入门篇 强化篇 文章目录 C语言指针系列文章目录1. assert 断言2. 指针的使用和传址调用2. 1 strlen的模拟实现2. 2 传值调用和传址调用 3. 数组名的理解4. 使用指针访问数组5. 一维数组传参的本质6. 冒泡排序7. 二级指针8. 指针数组9. 指针数组模拟实现…

C语言 ——— 将一句英语短句中的单词进行倒置

目录 题目要求 代码实现 题目要求 将一句英语短句中的单词进行倒置&#xff0c;标点符号不倒置 如&#xff1a; 输入&#xff1a;"I like chongqing very much," 输出&#xff1a;"much, very chongqing like I" 代码实现 #include<stdio.h> #i…

MyBatis where标签替换WHERE 1 = 1会提升性能吗

MyBatis <where>标签替换WHERE 1 1会提升性能吗 查看项目早期数据库查询语句时&#xff0c;发现很多地方写了WHERE 1 1&#xff0c;怀疑这里有性能损失&#xff0c;想替换成<where>标签。 验证 已知索引 CREATE INDEX BP_LOG_BP_DATE_IDX ON QXX.BP_LOG (BP_…

java实战项目-学生管理系统(附带全套源代码及其登录注册功能的实现)--《进阶篇》

一、前言 新增了登录注册的功能&#xff0c;代码量可能会有点大&#xff0c;所有代码加起来差不多560行。这个项目对于小白来说肯定是一大难关了。文章中的每张图都是作者亲手绘制的&#xff0c;简单明了&#xff0c;如果大家认同作者&#xff0c;希望可以支持一下作者。全套源…

Mysql-索引应用

目录 索引应用 MySQL有哪些索引? 普通索引和唯一索引有什么区别? 哪个更新性能更好? 、 聚簇索引的主键索引怎么设置? 追问:假如你不设置会怎么样? 我们一般选择什么样的字段来建立索引? 索引越多越好吗? 索引怎么优化? &#xff08;覆盖索引优化、防止索引失效、…

论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能

摘要 思维链提示&#xff08;Chain-of-thought prompting&#xff09;在多种自然语言推理任务上展现了卓越的性能。然而&#xff0c;在需要解决的问题比提示中展示的示例更难的任务上&#xff0c;它的表现往往不佳。为了克服从简单到困难的泛化挑战&#xff0c;我们提出了一种新…

华为认证的证书有哪些?

华为认证的证书体系丰富多样&#xff0c;涵盖了多个技术领域和不同的认证级别。以下是对华为认证证书的主要分类和特点的归纳&#xff1a; 一、认证等级 技术认证是华为认证体系中的核心部分&#xff0c;主要分为以下三个级别&#xff1a; HCIA&#xff08;华为认证初级&…

算法的时间复杂度和空间复杂度-概念

一、算法效率 算法在编成可执行程序后&#xff0c;运行时需要耗费时间资源和空间&#xff08;内存&#xff09;资源&#xff0c;因此衡量一个算法的好坏&#xff0c;一般是由时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 时间复杂度主要衡量算法运行的…

3.3、matlab彩色图和灰度图的二值化算法汇总

1、彩色图和灰度图的二值化算法汇总原理及流程 彩色图和灰度图的二值化算法的原理都是将图像中的像素值转化为二值(0或1),以便对图像进行简化或者特定的图像处理操作。下面分别介绍彩色图和灰度图的二值化算法的原理及流程: 1)彩色图的二值化算法原理及流程 (1)原理:…

快速在springboot项目中应用EasyExcel

目录 ​编辑一、介绍 二、准备工作 三、初始化项目 3.1 创建项目 3.2 引入依赖 3.3 创建数据库和数据表 3.4 编写application.properties文件 四、开始编写 4.1 目录结构 4.2 MyBatis配置类 4.3 用户实体类 4.4 mapper接口 4.5 编写数据操作文件 4.6 编写Service 业…

蓝牙串口通信:STM32F1系列与HC-05模块的连接

摘要 本文详细介绍了如何实现STM32F1系列微控制器与HC-05蓝牙模块的串口通信。通过本教程&#xff0c;读者将学习到硬件连接、软件配置和实际代码编写&#xff0c;为开发基于蓝牙的嵌入式项目打下基础。 1. 引言 在嵌入式系统中&#xff0c;无线通信是一个重要的功能。蓝牙作…