【跟着chatgpt学go】Gooutine和Channel
创始人
2025-05-30 23:24:09

Goroutine

Goroutine 是 Go 语言中的一种并发机制,它是一种轻量级线程,可以通过关键字 go 启动一个新的 Goroutine。相比传统的线程,Goroutine 拥有更小的栈空间,因此可以创建更多的 Goroutine。

下面是一个简单的 Goroutine 的示例:

package mainimport ("fmt""time"
)func main() {go func() {for i := 0; i < 5; i++ {fmt.Println("Goroutine:", i)time.Sleep(time.Second)}}()for i := 0; i < 5; i++ {fmt.Println("Main:", i)time.Sleep(time.Second)}
}

在这里插入图片描述
在上面的示例中,我们使用 go 关键字创建了一个匿名函数的 Goroutine。在 main 函数中,我们启动了一个 Goroutine,它会输出 Goroutine 和数字 i,然后等待一秒钟。同时,main 函数也会输出 Main 和数字 i,然后等待一秒钟。通过这个示例,我们可以看到,Goroutine 和 main 函数是并发执行的。

go function()
其中 function() 表示要在 goroutine 中执行的函数。在这种写法中,go 关键字后面直接跟着一个函数调用,并在函数调用后面添加了一对空的圆括号。这是因为在 Go 语言中,如果要将一个函数作为 goroutine 来运行,需要将它包装成一个函数值。而在这种写法中,函数值的声明和调用是同时完成的。另外,这种写法还可以在函数调用后面直接添加参数,例如:

go
Copy code
go func(x int, y int) {
// goroutine body
}(1, 2)

Channel

Channel 是 Go 语言中的一种通信机制,可以用来在 Goroutine 之间传递数据。Channel 可以看作是一个管道,数据可以从一个 Goroutine 通过 Channel 传递到另一个 Goroutine。

下面是一个简单的 Channel 的示例:

package mainimport ("fmt""time"
)func worker(id int, jobs <-chan int, results chan<- int) {for j := range jobs {fmt.Printf("Worker %d started job %d\n", id, j)time.Sleep(time.Second)fmt.Printf("Worker %d finished job %d\n", id, j)results <- j * 2}
}func main() {jobs := make(chan int, 100) //这行代码是在创建一个容量为100的整数类型的通道(channel)并将其赋值给变量jobs。这个通道可以在不同的goroutine之间传递整数类型的数据,而容量为100则表示这个通道最多可以同时存储100个整数,当通道中的元素数量达到容量上限时,再往里面发送数据会被阻塞,直到通道中有元素被接收走为止。results := make(chan int, 100)for w := 1; w <= 3; w++ {go worker(w, jobs, results)}for j := 1; j <= 5; j++ {jobs <- j}close(jobs)for a := 1; a <= 5; a++ {<-results}
}

在上面的示例中,我们定义了一个 worker 函数,它从 jobs Channel 中读取任务,然后执行任务并将结果发送到 results Channel 中。在 main 函数中,我们启动了 3 个 Goroutine,它们会执行 worker 函数。然后,我们向 jobs Channel 中发送了 5 个任务。最后,我们从 results Channel 中读取了 5 个结果。

在这里插入图片描述

通过这个示例,我们可以看到,Channel 可以很方便地在 Goroutine 之间传递数据,从而实现并发编程。

chan<- int 是一个只写的通道类型,表示只能向通道中写入数据,而不能从中读取数据。这种类型的通道常用于只提供数据发送的场合,如生产者-消费者模型中的生产者,它们只需要往通道中发送数据即可。
chan<- int 是一个只写的通道类型,表示只能向通道中写入数据,而不能从中读取数据。这种类型的通道常用于只提供数据发送的场合,如生产者-消费者模型中的生产者,它们只需要往通道中发送数据即可。

相关内容

热门资讯

“代抢票”背后的灰色产业链 抢... “演出经济”蓬勃发展,举办各类演唱会、音乐节等成为各地提升旅游收入、提振消费的“新密码”,热门艺人演...
Vue入门+DRF项目实战-0... 1. 引入Django REST framework 在本章中,我们要大家介绍为什么学习Django...
「VScode」通过VScod... 前言 之前在git的版本管理上,我使用的是sourcetree,说实话...
油价继续下跌?欧佩克宣布将再度... 5月31日,欧佩克线上会议讨论7月增产事宜,同意41.1万桶/日的大规模增产计划。当前,国内化工产业...
在生产计划项目中使用甘特图的5... 在生产计划中,会不断接收很多的订单项目,这时候就需要能够合理安排时间、资...
NOA渗透率超5%?智能汽车赛... 从L2到高速NOA(导航辅助驾驶),再到城区NOA...
赴港上市再添“新军”,背后有茅... 近日,资本市场再度迎来新动态,两家新三板摘牌公司 —— 先通医药与华曦达先后迈向港交所递表,计划转道...
小小科技八年磨剑IPO 第一个... 《投资者网》张伟5月,汽车零部件生产商安徽省小小科技股份有限公司(下称“小小科技”或“公司”)披露了...
精测转2上市价格预测 精测转2基本信息转债名称:精测转2,评级:AA-ÿ...
欧佩克宣布,再度增产! 5月31日,欧佩克线上会议讨论7月增产事宜,同意41.1万桶/日的大规模增产计划。 据新华财经5月3...
js常用循环方式 let list = [{name:'张三',age:22},{name:'李四',age:...
nvmf代码分析 nvmf代码分析NVMf RPC接口文件1、创建RDMA Port监听2、创建NVMf链接nvmf_...
【微服务】—— Nacos设计... 文章目录一、简介Nacos起源Nacos 定位Nacos 优势二、Nacos 总体设计1࿰...
axios 请求其他服务器地址... 场景还原: Vue2项目中在生产环境调用其他服务器请求地址时候会在请求地址默认加上一串当前浏览器域...
一斤便宜10元还要降?榴莲可以... 最近几年,各种知名水果的价格可以说都出现了比较大的变化,特别是最近榴莲的价格持续下降,甚至还有降价的...
图解redis对象(hash ... 哈希表 哈希对象的编码可以是ziplist或者hashtable 条件 ·哈希对象保存的所有键值对的...
C语言再学习 -- C 标准库... 参看:C 标准库 - stdlib.h C 标准库 - 简介 stdlib .h 头...
欧佩克+连续第三次大幅增产,油... 欧佩克连续第三次大幅增产,这一举措无疑给油价带来了巨大压力,恐使其承压下跌。欧佩克作为全球重要的石油...
python 安装包相关命令 查看匹配的版本(大小写敏感)pip -V 查询已经安装了的包,并可以显示相应的版本&...
“2025外贸优品中华行——天... 中新网天津5月31日电 (记者 王君妍)31日,“2025外贸优品中华行—天津站”活动正式启幕。本次...
基于SpringBoot+Vu... 您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 &#...
网络技巧|远程桌面连接不上的多... 写在前面的话专注于网络各种技巧和实用工具的分享,都是日常工作中遇到的大大小小问题记录下...
IM即时通讯软件系统源码安卓、... demo软件园每日更新资源,请看到最后就能获取你想要的: ​ 1.《计算机系统结构:解...
讲解一下关于MySQL数据库的... 对于数据库,市面上有着不少的数据库!比如:Oracle数据...
3.1.2数据库体系结构:分布... 3.1.2数据库体系结构:分布式数据库、分布式数据库特点、分布式数据库结构、数据分片、...
学习streamlit-6 系列目录 学习streamlit-1,简介学习streamlit-2,s...
冒泡 VS 插入 VS 选择—... 文章目录什么样的“排序算法”更加优质?排序算法的执行效率排序算法的内存消耗排序算法的稳...
Python 多线程 文章目录一、简介1.1 多线程的特性1.2 GIL二、线程1.2 单线程1.3 多线程三、线程池3....
基于树莓派实现超声波测距 目录 一,写在前面 二,超声波模块说明 ● 模块基本参数 ● IO口接线...
Linux(网络基础---数据... 文章目录0. 前言1. 以太网的帧格式2. 再谈局域网原理3. 汇总整体通信流程,补全...